问题描述
我在numpy中使用了fft
函数,这导致了一个复杂的数组.如何获得准确的频率值?
I used fft
function in numpy which resulted in a complex array. How to get the exact frequency values?
推荐答案
np.fft.fftfreq
告诉您与系数相关的频率:
np.fft.fftfreq
tells you the frequencies associated with the coefficients:
import numpy as np
x = np.array([1,2,1,0,1,2,1,0])
w = np.fft.fft(x)
freqs = np.fft.fftfreq(len(x))
for coef,freq in zip(w,freqs):
if coef:
print('{c:>6} * exp(2 pi i t * {f})'.format(c=coef,f=freq))
# (8+0j) * exp(2 pi i t * 0.0)
# -4j * exp(2 pi i t * 0.25)
# 4j * exp(2 pi i t * -0.25)
OP询问如何找到以赫兹为单位的频率.我相信公式是frequency (Hz) = abs(fft_freq * frame_rate)
.
The OP asks how to find the frequency in Hertz.I believe the formula is frequency (Hz) = abs(fft_freq * frame_rate)
.
这里有一些代码可以证明这一点.
Here is some code that demonstrates that.
首先,我们制作一个440 Hz的波形文件:
First, we make a wave file at 440 Hz:
import math
import wave
import struct
if __name__ == '__main__':
# http://stackoverflow.com/questions/3637350/how-to-write-stereo-wav-files-in-python
# http://www.sonicspot.com/guide/wavefiles.html
freq = 440.0
data_size = 40000
fname = "test.wav"
frate = 11025.0
amp = 64000.0
nchannels = 1
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
data = [math.sin(2 * math.pi * freq * (x / frate))
for x in range(data_size)]
wav_file = wave.open(fname, 'w')
wav_file.setparams(
(nchannels, sampwidth, framerate, nframes, comptype, compname))
for v in data:
wav_file.writeframes(struct.pack('h', int(v * amp / 2)))
wav_file.close()
这将创建文件test.wav
.现在我们读入数据,对其进行FFT,找到最大功率的系数,并找到相应的fft频率,然后转换为赫兹:
This creates the file test.wav
.Now we read in the data, FFT it, find the coefficient with maximum power,and find the corresponding fft frequency, and then convert to Hertz:
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
这篇关于如何在python中提取与fft值相关的频率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!