从多维FFT中提取频率

5 投票
1 回答
10652 浏览
提问于 2025-04-17 14:02

我写了一段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这一行出问题,因为我是最后加上去的。那么,如何提取二维频率成分呢?

1 个回答

11

你传入了一个无效的参数: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)

撰写回答