首页 > 解决方案 > 使用 pyaudio 生成幅度增加的音调

问题描述

我正在尝试生成类似于我使用 audacity 创建的音调,其中幅度使用 pyaudio 从 0.1 增加到 1。

在此处输入图像描述

到目前为止,我还没有成功地弄清楚如何在 pyaudio 中做到这一点。我可以生成一个正弦波,但不能创建一个幅度增加的正弦波。

如果有帮助,我的目标是使用树莓派 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()

标签: pythonaudioraspberry-pisignal-processingpyaudio

解决方案


如果您可以提前生成音频,您可以简单地将增加的增益作为乘数应用于每个样本作为后处理步骤。

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

推荐阅读