[英]How to find the fundamental frequency of a wav file
我正在分析很多短的 .wav 文件,並且對於部分分析,我只想繪制文件的基頻。 我的信號處理有點生疏,但我現在得到的圖看起來應該是正確的。 我只是不明白為什么 y 軸刻度是關閉的(F0 大約是 300Hz,而它應該在 8000Hz 左右)。 所以我想在 .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])
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)
很難判斷,因為您沒有提供繪圖代碼,但如果您的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()
頻譜圖准備使用以下拋出的錯誤你可以幫助糾正 f, t, Sxx = signal.spectrogram(y[:, 0], samplerate) IndexError: too many indices for array: array is 1-dimensional, but 2 were索引
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.