一、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)