首页 > 解决方案 > 如何在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)

但正如预期的那样,它也并不顺利。而当最好设置为高时,声音非常失真。有什么想法可以使这种平滑的频率扫描声音?

谢谢你。

标签: pythonpyaudio

解决方案


推荐阅读