从多维 FFT 中提取频率

Posted

技术标签:

【中文标题】从多维 FFT 中提取频率【英文标题】:Extracting frequencies from multidimensional FFT 【发布时间】:2013-01-13 00:02:57 【问题描述】:

我编写了一个 python 代码来获取二维信号并对其进行 FFT,现在我想提取与 FFT 相关的频率。 np.fft.fftfreq 失败,给我错误

File "/usr/lib64/python2.7/site-packages/numpy/fft/helper.py", line 153, in fftfreq
    assert isinstance(n,types.IntType) or isinstance(n, integer)
AssertionError

我的代码是:

import numpy as np
import scipy as sp
import pylab
import sys
import math

filename = sys.argv[1]  # Get name of file to open 

ifp = open(filename, "r")
ifp.seek(0)

nrows = 0
ncols = 0

nrows = sum(1 for line in ifp) # Sum over all the lines in the file ptr

ifp.seek(0) # Set the fptr back to beginning of file
for line in ifp:
   ncols = len(line.split()) #Split and count number of words in a line
   if ncols > 0:
      break

OrigData = np.zeros([nrows, ncols], dtype=np.float32) #Allocate numpy array
FFTData = np.zeros([nrows, ncols], dtype=complex)
IFFTData = np.zeros([nrows, ncols], dtype=complex)
FreqComp = np.zeros([nrows, ncols], dtype=np.float32)

ii = 0
jj = 0
ifp.seek(0)
for line in ifp:
   linedata = line.split()
   jj = 0
   for el in linedata:
      OrigData[ii,jj] = float(el)
      jj+=1
   ii+=1
ifp.close()

FFTData = np.fft.fft2(OrigData)
FreqComp = np.fft.fftfreq(FFTData, d=2)

#--- Continue with more code ---#

我知道除了np.fft.fftfreq 行之外的所有其他内容都有效,因为我在最后添加了它。如何提取二维频率分量?

【问题讨论】:

见mail.scipy.org/pipermail/scipy-user/2009-August/022106.html 【参考方案1】:

您传入的参数无效:np.fft.fftfreq 将信号数据的大小作为第一个参数(整数),将时间步长作为第二个参数。你传入一个数组作为第一个参数。

您需要先对信号执行np.fft.fft

讨厌指出明显的,但阅读np.fft.fftfreq...示例代码非常清楚。


执行 2D FFT 后,您可以获得沿每个维度的采样频率,如下所示:

FreqCompRows = np.fft.fftfreq(FFTData.shape[0],d=2)
FreqCompCols = np.fft.fftfreq(FFTData.shape[1],d=2)

【讨论】:

抱歉,我忘记粘贴我执行 FFT 的行。 :P 但是这对于 2d 案例将如何工作?它将返回一维频率分量数组,我对如何解释它感到困惑。 您使用的是 fft 还是 fft2?啊,抱歉,没有注意到你的更新。 fft2,它们都是我定义的二维数组。 谢谢!但是现在我对如何解释它感到困惑......如果我必须弄清楚二维数组上一个点的频率,这种方法会给我两种不同的频率,一种用于行,一种用于列。这会是sin 波的xy 分量的频率吗? 您似乎和我在可视化 2D 信号及其相应的 2D 频率分布时遇到了同样的麻烦。目前我能想到的最好的方法是将其视为两个正交波(如 EM 场),因此 2D FFT 将是每个波的频率距离......

以上是关于从多维 FFT 中提取频率的主要内容,如果未能解决你的问题,请参考以下文章

从音频文件中提取音高特征

从歌曲中获取当前音频频率 - Java(也许使用 FFT?)

使用 EZAudio 从 FFT 获得更精确的频率?

MATLAB中fft的频率轴怎么计算

如何使用 FFT 从 PCM 获取频率数据

如何在每个FFT计算中检索不同的原始频率并且在java中没有任何频率泄漏