Генерация тона с возрастающей амплитудой с помощью pyaudio - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь создать тон, похожий на тот, который я создал, используя Audacity, где амплитуда увеличивается с 0,1 до 1, используя pyaudio.

enter image description here

Пока мне не удалось понять, как это сделать в pyaudio. Я могу сгенерировать синусоидальную волну, но не могу создать ее с возрастающей амплитудой.

Я нацелен на использование Raspberry Pi 4, если это поможет.

Редактировать - Вот что я пробовал до сих пор. В основном я пробовал комбинировать синусоидальную волну с первой половиной треугольной волны.

import pyaudio
import numpy as np
import wave
from scipy import signal
p = pyaudio.PyAudio()

#amp 5000
FORMAT = pyaudio.paInt16 
filename = 'test8.wav'
chunk = 1024
channels = 1
sample_format = pyaudio.paInt16
def excitation(freq=60 ,duration=9, amplitude=1, fs=44100):
    p = pyaudio.PyAudio()
    #Sine wave generation
    seconds = duration
    sine = (amplitude*np.sin(2*np.pi*np.arange(fs*duration)*freq/fs)).astype(np.float32)


    t = np.linspace(0, duration*2, fs*duration)
    triangle = signal.sawtooth(2 * np.pi * (1/(duration*2)) * t)
    ramp = amplitude* 2 *triangle[0:(len(sine))]

    samples = sine + ramp

    stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=fs,
                output=True,
                input = True)

    frames = []  # Initialize array to store frames
    stream.write(samples)


    # Store data in chunks for 3 seconds
    for i in range(0, int(fs / chunk * seconds)):
        data = stream.read(chunk)
        frames.append(data)

    # Stop and close the stream 
    stream.stop_stream()
    stream.close()
    # Terminate the PortAudio interface
    p.terminate()

    # Save the recorded data as a WAV file
    wf = wave.open(filename, 'wb')
    wf.setnchannels(channels)
    wf.setsampwidth(p.get_sample_size(sample_format))
    wf.setframerate(fs)
    wf.writeframes(b''.join(frames))
    wf.close()

    return 

excitation()

1 Ответ

0 голосов
/ 09 мая 2020

Если вы можете сгенерировать звук заранее, вы можете просто применить увеличивающееся усиление в качестве множителя к каждому сэмплу в качестве шага постобработки.

samples = generate_samples()
for i in range(0, len(samples)):
  samples[i] *= i/len(samples)  

Вы также можете сделать это в numpy следующим образом:

samples = generate_samples() #returns a np.array
ramp = np.arange(0,1,1/len(samples))
samples *= ramp
...