使用sounddevice numpy数组执行fft

时间:2019-02-14 05:06:06

标签: python numpy fft

我似乎无法弄清楚为什么我的代码无法产生 由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

1 个答案:

答案 0 :(得分:0)

记录函数sd.rec()返回二维[44100,1]形状的numpy数组。尺寸1与通道数(此处为1)有关。要对其进行测试,请输入:

print( recording.shape)

然后,在长度1的最后一个维度上执行dft。因此,yk没有任何变化,并且recordingnp.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