组合长度比样本数据短的 FFT 以获得所有数据的频谱

信息处理 fft 频谱 对数啁啾
2022-02-16 19:53:30

我有一组样本数据,一个对数扫频正弦,即 1 秒的持续时间,以 100kHz 采样,提供 100k 个样本。我想计算完整数据的频谱,但是可用的 FFT 库函数最多仅支持 4096 个样本。

顺序 FFT 4096 个样本并对结果数据求和是否有效。从而以显示整个 100k 样本的频率内容的 4096/2 个频点结束?

我想有必要对 4096 个样本的每个块进行窗口化以进行 FFT,但这意味着频率内容的部分将被人为地降低幅度。

如何处理相位信息?

2个回答

是的,你可以做到,但你会失去光谱分辨率。您提到的方法是韦尔奇谱图估计算法的一种变体,它依赖于基于块的长序列功率谱估计,其中的较短块。

假设您有一个长度为 k 且在 k 时采样的数据,那么矩形窗口后的全长 DFT 将为您提供大约 Hz 到 Hz 的光谱分辨率,其中样本的窗口将产生约 Hz 至 Hz 的光谱分辨率。100Fs=1001340962575

如果此分辨率足以满足您的目的,那么您可以(实际上您应该更好)执行基于块的平均光谱分析,以便在降低的光谱分辨率和提高的估计精度(降低的估计方差)之间进行权衡

在 Rabiener 和 Gold 的 1975 年 DSP 书中,第 347 页附近的索引术语“旋转因子”附近列出了一个部分,该部分显示了如何在二维中分解 DFT。在 FFTW 之前,我经常使用它来做奇怪的 DFT 大小,比如 384,没有零填充。

数字信号处理理论与应用
Prentice-Hall 信号处理系列 Lawrence R. Rabiner, Bernard Gold, Prentice-Hall, 1975

首先,您需要将所需的 DFT 大小分解为 2 个数字 M 和 N,然后分配一个 M × N 矩阵。将数据按行顺序写入矩阵,在填充时跳到下一行。这是一个就地算法。

在每列上做 M 点 DFT。接下来将矩阵中的每个元素乘以其旋转因子其中 m 和 m 是给定 Fortran 约定的索引项。在每一行上做 N 点 DFT。按列顺序读出结果。exp(j2π(m1)(n1))

Matlab代码:

清除所有
M=3;
N=32;
x=linspace(0,10,M*N);
X=reshape(x,N,M).'; % 读入行
Twiddle=zeros(size(X));
对于 i=1:M
对于 k=1:N
Twiddle(i,k)=exp(-1j*2*pi*(i-1) (k-1)/(N M));
end
end
X=fft(X) % fft on each column
X=X.*Twiddle;% element by element product
X=fft(X.').' ; 每行 %fft
y=reshape(X,N*M,1); % 读出为列
图(1)
绘图(abs(y),'linewidth',2)
标题('复合 DFT')
图(2)
绘图(abs(fft(x)),'linewidth',2)
标题('Direct DFT')
图(3)
plot(x,'linewidth',2)
标题('时间序列')

情节: 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

Rabiener 的书中还提到了另一个命令。首先旋转,行fft,列fft。他还特别指出,只要 N 不是质数,每一行或每一列的 dft 都可以实现,进而作为复合平方。行进列出索引也很有趣,因为它概括了位反向寻址。

总之,如果你有足够的内存,你可以用 4k DFT 做 100k DFT。