import wave
import struct
import numpy as np
if name == '__main__':
data_size = 40000
fname = "test.wav"
frate = 11025.0
wav_file = wave.open(fname, 'r')
data = wav_file.readframes(data_size)
wav_file.close()
data = struct.unpack('{n}h'.format(n=data_size), data)
data = np.array(data)
w = np.fft.fft(data)
freqs = np.fft.fftfreq(len(w))
print(freqs.min(), freqs.max())
# (-0.5, 0.499975)
# Find the peak in the coefficients
idx = np.argmax(np.abs(w))
freq = freqs[idx]
freq_in_hertz = abs(freq * frate)
print(freq_in_hertz)
# 439.8975
這個是對於單個data_size,frate已知的情況,真實情況是未知,且有多個頻率的信號。求解。。。
對於單個頻率的波形,取頻譜的峰值,np.argmax()可以取到下標值,根據freq=下標*N/fs,獲得頻率值, 對於含有多個頻率的波形,我是做一個區分,判斷頻譜中
振幅大於某個數,就為信號,小於某個數就為噪聲。這樣不准確,最好用信噪比判斷,然後同樣獲取下標,獲得頻率值,相應還能得到幅度。