gpt4 book ai didi

python - 使用 sounddevice numpy 数组执行 fft

转载 作者:太空宇宙 更新时间:2023-11-03 21:16:16 24 4
gpt4 key购买 nike

我似乎无法弄清楚为什么我的代码不会产生 fft由 sounddevice.rec() 制成的 numpy 数组我能够让代码与音频文件一起使用,但不能与sounddevice 的数据

这是我的代码:

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

最佳答案

记录函数sd.rec()返回形状为[44100,1]的二维numpy数组。维度1与 channel 数有关(此处为1)。要测试它,请输入:

print( recording.shape)

然后,在长度为 1 的最后一个维度上执行 dft。因此,没有任何变化,ykrecording 完全相同。

为了纠正这个问题,可以将实数到复数 DFT np.fft.rfft() 应用于 recording[:,0]。此外,可以添加 Tuckey 窗来缓和将非周期信号帧视为周期信号周期的影响:边缘处的不连续性引入杂散频率(频谱泄漏)(参见 window function)。

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()

关于python - 使用 sounddevice numpy 数组执行 fft,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54683525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com