MATLAB函数fft(data,N)输入注意事项

x_fft = fft(data, L);

若data的数据长度为1001

这个函数中的L的取值,可以取四种情况:

  1. 不设置,缺省
  2. 是取数据本身长度:L 1= length(data)=1001;(推荐使用这个!)
  3. 取:L 2= 2^nextpow2(L1); L2=1024,总是大于或者等于L1
  4. 取L 3=2^(floor(log2(L 1))); L3=512,总是小于或者等于L1(实验室使用,要注意可能出现的错误!)

第一种情况:不设置

第二种情况:L 1= length(data)

第三种情况: L 3=2^(floor(log2(L 1))),可以看到对噪声在某些频段放大或者缩小了!

第四种情况:L 2= 2^nextpow2(L1)

实验室程序和使用数据长度fft(data,N(data))的对比

产生一个拉莫尔进动频率数据序列,数据序列长度为N=10000:然后求PSD获取共振位置,结果如图所示:

正常算法:

L_Data = length(Data);

Sy=fft(Data);

实验室算法:

L_Data = length(Data);

nfft = 2^(floor(log2(L_Data)));
Sy=fft(Data,nfft);

实验室算法获得的结果为:5750Hz, 而正常算法获取的结果为:7000kHz, 满足正确要求。

正常算法: N=10000,实验室算法:N=8192;输入fft(data,N)中导致两种差距较大的结果,值得注意!

例2:,可以看到,实验室算法依旧会出错。

可以看到PSD的幅度和原始信号幅度不一样,修改下FFT程序:

function freq,Sy = FFTfunction3(Data,Fs)

%==========================获得信号真实幅度

L_Data = length(Data);

Sy=fft(Data,L_Data);

Sy=abs(Sy)*2/L_Data;

Sy = Sy(1:L_Data/2+1);

freq = Fs*(0:L_Data/2)/L_Data;

end

则可以获得如下FFT结果,幅度和真实信号幅度一致,等于2

错误原因:

fft(data,N), 若N小于数据data的长度,自动补零,使得这些零也默认为真实信号数据,这些信号显然不符合真实信号规律,经过FFT后自然就会影响频率的大小!因此fft的第二个参数就用缺省情况或者等于数据长度,输入或大或小都会对FFT结果产生影响:这种影响包括噪声功率谱大学(PSD)和频率大小!

相关推荐
Evand J3 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
严肃小白兔1 天前
MATLAB 绘图与科研论文插图制作:图形设计、统计表达与矢量导出
开发语言·matlab·科研绘图
严肃小白兔2 天前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
Evand J3 天前
【PMSM例程】(14)永磁同步电机无迹卡尔曼滤波(UKF)定子电阻在线辨识与补偿。电阻变化跟踪及预测误差对比仿真。附完整代码的下载链接
matlab·电机·滤波·卡尔曼滤波·永磁同步电机·无迹卡尔曼滤波·pmsm
爱喝雪碧的可乐3 天前
MATLAB
开发语言·算法·matlab
严肃小白兔3 天前
MATLAB 优秀开源项目与工具箱推荐:涵盖通信、图像处理、脑机接口等九大领域
图像处理·matlab·信息与通信·开源项目
Evand J5 天前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
分享资料6 天前
MATLAB 中分号 (;)的作用
matlab
Evand J6 天前
【PMSM例程11】永磁同步电机(PMSM)基于UKF的转速与转子位置估计。附下载链接
算法·matlab·卡尔曼滤波·永磁同步电机·ukf·pmsm·位置估计
严肃小白兔7 天前
优秀 MATLAB 作者、书籍推荐:国外经典教材与技术资源整理
matlab