Abstract
Keywords Matlab  数字信号处理 
Citation Yao Qing-sheng.【数字信号处理】Matlab 做 Fft 时点数 N 怎么选取.FUTURE & CIVILIZATION Natural/Social Philosophy & Infomation Sciences,20220330. https://yaoqs.github.io/20220330/shu-zi-xin-hao-chu-li-matlab-zuo-fft-shi-dian-shu-n-zen-me-xuan-qu/

转载自 https://blog.csdn.net/baidu_37973494/article/details/81076343

(作为笔记,防止遗忘)

一、FFT 点数 N(也就是离散时间信号的记录长度):要根据所要求的的频率分辨率 F 来决定。

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

N 和 F 的关系:N>=Fs/F, Fs 为采样频率。由于 FFT 一般要求 N 是 2 的整数幂,所以最后还要把 N 扩大为最接近 2 的整数幂。

二、参考网页如何决定要使用多少点来做 fft:https://zhidao.baidu.com/question/1111808097700853939.html(重点)

fft 函数出来的应该是个复数,每一个点分实部虚部两部分。假设采用 1024 点 fft,采样频率是 fs,那么第一个点对应 0 频率点,第 512 点对应的就是 fs/2 的频率点。然后从头开始找模值最大的那个点,其所对应的频率值应该就是你要的基波频率了。

假设采样频率为 Fs,信号频率 F,采样点数为 N。那么 FFT 之后结果就是一个为 N 点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为 A,那么 FFT 的结果的每个点(除了第一个点直流分量之外)的模值就是 A 的 N/2 倍。而第一个点就是直流分量,它的模值就是直流分量的 N 倍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
%-----------------------------------------------%
%Author : aoxiang_ywj
%Project : Matlab做fft时点数N怎么选取
%Brief introduction :
%假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。
%用数学表达式就是如下: S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
%式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。
%按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。
%我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢? 看figure(2)
%-----------------------------------------------%
clc;
clear;
close all; %先关闭所有图片
Adc=2; %直流分量幅度
A1=3; %频率F1信号的幅度
A2=1.5; %频率F2信号的幅度
F1=50; %信号1频率(Hz)
F2=75; %信号2频率(Hz)
Fs=256; %采样频率(Hz)
P1=-30; %信号1相位(度)
P2=90; %信号相位(度)
N=256; %采样点数
t=[0:1/Fs:N/Fs]; %采样时刻
%Fn=(1:1:N)*Fs/N; %频域点数

%信号
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%显示原始信号
plot(S);
title('原始信号');

figure;
Y = fft(S,N); %做FFT变换
Ayy = (abs(Y)); %取模
plot(Ayy(1:N)); %显示原始的FFT模值结果 与plot(Ayy);效果一样
%plot(Fn,Ayy(1:N));
title('FFT 模值');

figure;
Ayy=Ayy/(N/2); %换算成实际的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %换算成实际的频率值
plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果
title('幅度-频率曲线图');

figure;
Pyy=[1:N/2];
for i=1:N/2
Pyy(i)=phase(Y(i)); %计算相位
Pyy(i)=Pyy(i)*180/pi; %换算为角度
end;
plot(F(1:N/2),Pyy(1:N/2)); %显示相位图
title('相位-频率曲线图');
References