python - 使用 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()
解决方案
如果您可以提前生成音频,您可以简单地将增加的增益作为乘数应用于每个样本作为后处理步骤。
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
推荐阅读
- r - 基于特定模式对 R 中的字符向量进行子集化
- r - 在重新分配之前删除数据框
- java - 未知片段 - 映射 Android Studio
- matplotlib - 缩放无法加载腌制 matplotlib 图
- javascript - 用 JSDoc 标记一个不推荐使用的类
- android - Android Lint 是否支持对单个文件(xml、java)进行分析?
- java - Java-如何找到一维数组中所有值的排列并将它们存储在二维数组中
- ios - 在不了解代码的情况下发送应用程序
- elasticsearch - 在 kafka-connect 接收器中提取字段和解析 JSON
- javascript - 如何在javascript中将两个值检查合并为一行