如何在python中生成扫频声音

时间:2019-12-30 17:05:43

标签: python pyaudio

所以我试图用python产生可控的音调。我正在使用PyAudio,简单的代码是这样的(source):

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)

但正如预期的那样,进展也不顺利。当最好的设置为高时,声音会非常失真。有什么想法可以像扫频声音一样使它平滑吗?

谢谢。

0 个答案:

没有答案