我正在分析许多短的.wav文件,在分析的一部分中,我只想绘制文件的基本频率。我的信号处理有些生疏,但是现在我得到的图看起来应该是正确的。我只是不明白为什么y轴刻度不可用(F0应该在8000Hz左右时在300Hz左右)。 因此,我想像没有强度信息的声谱图一样在.wav文件的持续时间内绘制F0。 有人可以帮我吗?很高兴提供其他信息!
from scipy import signal
import numpy as np
import soundfile as sf
y, samplerate = sf.read('audiofile.wav')
chunks = np.array_split(y,int(samplerate/2000))
peaks = []
for chunk in chunks:
# simulated pure signal
t = np.linspace(0, 1, samplerate)
wave = chunk
# compute the magnitude of the Fourier Transform and its corresponding frequency values
freq_magnitudes = np.abs(np.fft.fft(wave))
freq_values = np.fft.fftfreq(samplerate, 1/samplerate)
# find the max. magnitude
max_positive_freq_idx = np.argmax(freq_magnitudes[:samplerate//2 + 1])
peaks.append(freq_values[max_positive_freq_idx])
答案 0 :(得分:0)
numpy.fft.fftfreq文档将第一个参数称为“窗口长度”,因此我建议替换
freq_values = np.fft.fftfreq(samplerate, 1/samplerate)
使用
freq_values = np.fft.fftfreq(len(wave), 1/samplerate)
或
freq_values = np.fft.fftfreq(wave.shape[0], 1/samplerate)
答案 1 :(得分:0)
由于您尚未提供绘图代码,所以很难做,但是如果您的wav
文件是立体声文件,则您将得到y
作为二维数组,这可能是潜在的问题。正如@Andris所建议的,窗口长度也需要校正。
如果要制作自己的频谱图,请检查fft
和fftfreq
的输出,顺序类似于[0 .. Fs/2 -Fs/2 ..]
。您可以使用fftshift
重新排序。
否则,还有一个频谱图可以在信号包中使用
f,t,Sxx = signal.spectrogram(y[:,0],samplerate)
plt.pcolormesh(t, f, np.log10(Sxx))
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()