python - 如何在python中提取与fft值相关的频率

标签 python numpy fft

我在 numpy 中使用了 fft 函数,这导致了一个复杂的数组。如何得到准确的频率值?

最佳答案

np.fft.fftfreq 告诉您与系数相关的频率:

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 询问如何以赫兹为单位找到频率。 我相信公式是 频率 (Hz) = abs(fft_freq * frame_rate)

这里有一些代码可以证明这一点。

首先,我们制作一个 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频率,然后转换为赫兹:

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 - 如何在python中提取与fft值相关的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3694918/

相关文章:

python - 为什么pykafka的生产者这么慢?

python - 如何让 numpy.argmax 返回所有出现的最大值?

python - 无法使用灵活类型执行 reduce

c++ - 在不使用递归的情况下将FFT应用于两个非常大的数的乘法

python - 返回一个实值的、相位加扰的时间序列

python - Pandas 添加列比较结果

python - 如何避免Python中Gtk.Dialog关闭?

python - 检查 False 的正确方法是什么?

python - 生成小时 :minute in Python 的列表

c++ - 使用 FFT (FFTW) 计算两个函数的卷积