python - 如何在python中产生频率扫描声音
问题描述
所以我试图用python生成一个可控的音调。我正在使用PyAudio
,简单的代码是这样的(源代码):
import pyaudio
import numpy as np
p = pyaudio.PyAudio()
fs = 44100 # sampling rate, Hz, must be integer
duration = 1.0 # in seconds, may be float
f = 440.0 # sine frequency, Hz, may be float
# generate samples, note conversion to float32 array
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32)
# for paFloat32 sample values must be in range [-1.0, 1.0]
stream = p.open(format=pyaudio.paFloat32,
channels=1,
rate=fs,
output=True)
# play. May repeat with different volume values (if done interactively)
stream.write(samples.tobytes())
stream.stop_stream()
stream.close()
p.terminate()
问题是当我按顺序播放 2 个不同的频率时,播放不流畅。我认为这是因为第一频率结束和第二频率开始之间的失真。我正在尝试使用此代码进行平稳过渡:
fstart = 440.0 # first frequency
fstop = 523.6 # second frequency
transition = 0.5 # transition time
finest = 10 # finest of transition
duration = 2.0 # duration of first and second frequency
samples = []
samples = np.asarray(samples)
# print(duration)
# print(fs*duration)
samples = np.append(samples, (np.sin(2*np.pi*np.arange(fs*duration)*fstart/fs)).astype(np.float32)).astype(np.float32)
for x in range(0, finest):
freq = fstart + (fstop-fstart)*x/finest
time = transition/finest
# print(time)
# print(fs*time)
samples = np.append(samples, (np.sin(2*np.pi*np.arange(fs*time)*freq/fs)).astype(np.float32)).astype(np.float32)
samples = np.append(samples, (np.sin(2*np.pi*np.arange(fs*duration)*fstop/fs)).astype(np.float32)).astype(np.float32)
但正如预期的那样,它也并不顺利。而当最好设置为高时,声音非常失真。有什么想法可以使这种平滑的频率扫描声音?
谢谢你。
解决方案
推荐阅读
- r - 在 R 中自动组合数据帧
- postfix-mta - iRedMail:域别名不适用于外部邮件
- php - 解决 php json JSON_ERROR_CTRL_CHAR 的最佳方法
- javascript - next.js 项目中的 Ant Design
- php - Laravel 5.8:请求会话似乎没有在控制器上设置会话
- flutter - Flutter:在 Gridview 项目的底部对齐小部件
- flutter - 如何将小部件中的参数放入 Dart 中的入门级调用中?
- python - 如何添加具有每小时特定值计数的新功能?
- c++ - 使用函数查找数组中的最大元素
- javascript - 如何避免多次调用useEffect