我似乎无法弄清楚为什么我的代码无法产生 由sounddevice.rec()制成的numpy数组 我可以获取与音频文件一起使用的代码,但不能与 声音设备的数据形式
这是我的代码:
import sounddevice as sd
import numpy as np
import matplotlib.pyplot as plt
duration = 1 #sec
fs = 44100
def record():
"""records from the mic"""
recording = sd.rec(int(duration * fs), samplerate = fs, channels =1,
dtype='float64')
#waits till ur finished recording
sd.wait(duration)
return recording
def play(recording):
"""plays recording"""
sd.play(recording, fs)
sd.wait(duration)
def plot_signal_freq(ys):
N = ys.size
print(N)
L = N/fs
yk = np.fft.fft_freq(ys)
k = np.arange(N)
freqs = k/L
fig, ax = plt.subplots()
ax.plot(freqs, np.abs(yk))
while True:
recording = record()
print(type(recording.dtype))
print(recording)
play(recording)
plot_signal_freq(recording)`
这是钢琴和弦文件上的fft图片: enter image description here
这是我录音中的fft图片 enter image description here
答案 0 :(得分:0)
记录函数sd.rec()
返回二维[44100,1]形状的numpy数组。尺寸1与通道数(此处为1)有关。要对其进行测试,请输入:
print( recording.shape)
然后,在长度1的最后一个维度上执行dft。因此,yk
没有任何变化,并且recording
与np.fft.rfft()
完全相同。
要解决此问题,可以将实数DFT recording[:,0]
应用于复数from scipy import signal
...
N = ys.shape[0]
print(N , ys.shape)
L = N/fs
tuckey_window=signal.tukey(N,0.01,True) #generate the Tuckey window, widely open, alpha=0.01
ysc=ys[:,0]*tuckey_window #applying the Tuckey window
yk = np.fft.rfft(ysc) #real to complex DFT
k = np.arange(yk.shape[0])
freqs = k/L
fig, ax = plt.subplots()
ax.plot(freqs, np.abs(yk))
plt.show()
。此外,可以添加一个Tuckey窗口来缓和将非周期性信号的帧视为周期性信号的周期的效果:边缘处的不连续会引入杂散频率(频谱泄漏)(请参阅window function) 。
while.keyup