比较图像 FFT 与正弦波 FFT

信息处理 fft matlab 频率 自由度
2022-02-07 12:37:35

因此,当我们对任何复合或单个正弦波进行 FFT 时,我们会在图的 x 轴上得到准确的频率。我们在 FFT 中获得原始频率的点取决于采样率和实际信号的长度,即

如果有正弦波100KHz且采样频率等于1MHz,并且如果我们绘制 10 次振荡,即t = 10/f信号的长度将是100如果我们绘制该信号的 FFT,则 FFT 中的第一个点代表10KHzie 1MHz/100 = 10KHz因此实际信号频率将绘制在10thFFT 图的点上,(10KHz*10 = 100KHz)。

这就是我们如何在频域中看到实际信号的频率。

但是图像呢?

考虑一个二值8x8图像,

image = [zeros(8,4) ones(8,4)]

image =

     0     0     0     0     1     1     1     1
     0     0     0     0     1     1     1     1
     0     0     0     0     1     1     1     1
     0     0     0     0     1     1     1     1
     0     0     0     0     1     1     1     1
     0     0     0     0     1     1     1     1
     0     0     0     0     1     1     1     1
     0     0     0     0     1     1     1     1

将为每一行和每一列计算 FFT,这意味着计算每个 FFT 的样本数将为 8。

我知道 FFT 值没有频率,它只有复振幅,那么如何为图像绘制 FFT,如何通过将 Fs 除以信号长度来识别实际频率,就像我在正弦波的情况下所做的那样?

这是信号的一维 FFT,

x = [0 0 0 0 1 1 1 1]; %what are the frequencies here

    % Samples = 8

    f = fft(x)
    plot (abs(f))

在此处输入图像描述

有人可以解释一下FFT图中的频率是多少!???我只需要一个很好的例子来解释这个信号的 FFt 图,就像我对正弦波所做的那样。

2个回答

x = [0 0 0 0 1 1 1 1]是(非带限)方波的一个周期,具有 DC 偏移,周期等于窗口的周期。

....''''....''''....''''

DC 分量是索引 1 处的 FFT 值(请记住,Matlab 的数组索引从 1 开始,而不是更合理的基于 0 的索引),要获得真实值,您必须除以样本数(4/8 = 1/2 直流偏移)。方波是索引 2 和 4 处的分量。因为信号是真实的,所以 6、7、8 处的分量只是 4、3、2 的镜像。

方波由幅度为 1/n 的奇次谐波组成,因此基波 f1

  • 频率 f1,幅度 1
  • 频率 3*f1,幅度 1/3
  • 频率5*f1,幅度1/5
  • 频率7*f1,幅度1/7
  • ...

由于您的样本数量非常少,因此在达到奈奎斯特频率之前,您只有前 2 个谐波的空间。因此,索引 4 处的值是三次谐波,它应该是索引 2 处的值的大约 1/3,即一次谐波(尽管由于混叠而不完全是 1/3)。

如果您的采样频率为 1 MHz,索引 2 处的值表示基频,那么您知道方波基频为 (index-1)*fs/N = (2-1)*1MHz/8 = 125 kHz ,或采样频率的 1/8,如您所料。

尝试用更长的信号进行试验,这样会更容易看到发生了什么。

首先,对于短的一维信号,对原始信号进行 FFT 填充零是有用的。这样 FFT 将具有更高的分辨率,并且更容易识别特定频率。为了绘制 FFT,我使用这个简单的函数来生成准确的频率轴。

function f=faxis(N,fs)
 deltaf=fs/N;
 if 2*floor(N/2)==N % N is even
 f=linspace(-fs/2,fs/2-deltaf,N);
 else % N is odd
 f=linspace(-(fs-deltaf)/2,(fs-deltaf)/2,N);
end

绘制信号 fft 的示例:

x = [0 0 0 0 1 1 1 1];
f = fft(x,1024); % fft of x padded 1016 zeros

% plotting f in logarithmic scale, sampling frequency is 10000 Hz
plot(faxis(length(f),10000), 20*log10(abs(fftshift(f))));

对于 2D 信号(图像):

image = [zeros(8,4) ones(8,4)]
f = fft2(image,1024,1024); % padding to get higher resolution in frequency
imagesc(20*log10(abs(fftshift(f)))); % ploting in logarithmic scale

对于图像,频率单位不清楚(不是赫兹,因为它是空间频率,应该是 1/米),所以最好用最大频率为 PI(或 1.0)的数字术语来考虑。使用上面的代码,您将打开一个图,其中最低频率位于中间,边缘为高频 (PI)。