【20211229】【信号处理】傅里叶变换 FFT 的点数 N 如何选取?

【20211229】【信号处理】傅里叶变换 FFT 的点数 N 如何选取?

一、FFT 点数 N 选择不合理有什么影响?

1. N 过小

栅栏效应,即频域频率分辨率不够,无法区分出某些频率成分。详见:【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应

2. N 过大

(1)增加了额外的计算量;

(2)频谱不对。

二、如何选取 FFT 点数 N?

取决于要求的频率分辨率 F。

频率分辨率 F 的定义:能够用 FFT 算法分析得到的最靠近的两个信号频率的频率间隔。

FFT 点数和频率分辨率的关系:N ≥ fs / F,其中 fs 为采样频率,由于 FFT 一般要求 N 是 2 的整数幂,所以要把 N 扩大到最接近的 2 的整数幂。

N 越大,F 越高,但 N 并不是越大越好。

三、举个栗子

%% FFT 点数 N选取

clear; clc; close all; warning off;

%% 参数设置

fs = 100; % 采样频率(满足奈奎斯特采样定理:要大于信号最大频率的两倍!!!)

L = 10; % 时间长度

t = 0 : 1/fs : L; % 时间坐标

%% 生成信号

f1 = 6; % 信号1频率

f2 = 5; % 信号2频率

s1 = 10 * sin(2 * pi * f1 * t);

s2 = 10 * sin(2 * pi * f2 * t);

s = s1 + s2; % 合成信号

%% FFT

numfft0 = 256; % FFT点数

s0_fft = fft(s, numfft0);

p0 = pow2db(abs(s0_fft(1:numfft0/2)) .^ 2); % 功率(只取正频部分)

f0 = (0 : numfft0/2-1) / numfft0 * fs; % 频率(只取正频部分)

numfft1 = 512; % FFT点数

s1_fft = fft(s, numfft1);

p1 = pow2db(abs(s1_fft(1:numfft1/2)) .^ 2); % 功率(只取正频部分)

f1 = (0 : numfft1/2-1) / numfft1 * fs; % 频率(只取正频部分)

numfft2 = 1024; % FFT点数

s2_fft = fft(s, numfft2);

p2 = pow2db(abs(s2_fft(1:numfft2/2)) .^ 2); % 功率(只取正频部分)

f2 = (0 : numfft2/2-1) / numfft2 * fs; % 频率(只取正频部分)

numfft3 = 2048; % FFT点数

s3_fft = fft(s, numfft3);

p3 = pow2db(abs(s3_fft(1:numfft3/2)) .^ 2); % 功率(只取正频部分)

f3 = (0 : numfft3/2-1) / numfft3 * fs; % 频率(只取正频部分)

%% 作图

figure(1);

subplot(2, 2, 1);

plot(f0, p0, 'linewidth', 1.5); axis('tight'); title([num2str(numfft0), '点傅里叶变换']);

subplot(2, 2, 2);

plot(f1, p1, 'linewidth', 1.5); axis('tight'); title([num2str(numfft1), '点傅里叶变换']);

subplot(2, 2, 3);

plot(f2, p2, 'linewidth', 1.5); axis('tight'); title([num2str(numfft2), '点傅里叶变换']);

subplot(2, 2, 4);

plot(f3, p3, 'linewidth', 1.5); axis('tight'); title([num2str(numfft3), '点傅里叶变换']);

从运行结果可以看出,当N=256时刚刚能区分出两种频率成分,可能 N 再减小一些就无法分辨这两种频率成分了,即 N 再减小就可能发生栅栏效应;当 N=1024 和 N=2048 时,频谱发生畸变,也就是说 N 并不是越大越好。

(参考:【数字信号处理】Matlab做fft时点数N怎么选取)

(参考:如何决定要使用多少点来做fft)

相关推荐