Matlab FFT变换细节(信号采样频率,FFT变换点数,频率分辨率)

  • Post author:
  • Post category:其他


问题:

在做深度学习的故障诊断中,发现代码直接将原始信号fft之后直接将实频域信号输入网络中进行诊断,虽说效果比较不错95%

但因为输入的是双边谱且频率范围远超故障特征频率同时由于单个样本的点数只有1024点,信号的采样频率又特别高12k,导致频率分辨率极低,输入网络的序列,失去了物理意义,因此想通过优化FFT变换的设置参数,将频率分辨率较高且频率范围[0,800]的序列输入网络,用于提高故障识别准确率

基础:


信号采样频率

: 1秒设备采到的信号点数


FFT变换点数

:默认为输入信号的点数,也可以设置任意数值,matlab示例中有关于优化点数的方法,寻找点数最近的2次方

出于算法性能的考虑,fft 允许您用尾随零填充输入。
使每行的长度为比当前长度大的下一个最小的 2 的次幂值。
使用 nextpow2 函数定义新长度。

n = 2^nextpow2(L);


频率分辨率

:频域横坐标点之间的间隔 FS/N 采样频率/样本长度

测试:

1.实验室采集的实际信号 通常的分析方法

% 30s 12800 采样频率分析 信号长度为12800*30
y = y -mean(y);
yft = abs(fft(y,12800*30));
yft = yft / length(y);
N = 1 : 12800*30 ;% 采样点数序列
f = 1/30*N; % 频率横坐标
figure(1);
plot(f(1:length(yft)/2) , yft(1:length(yft)/2));

2.测试FFT采样点数与频率分辨率的关系

% fft 只选取信号1024个点 fft变换点数 12800*30
y = y -mean(y);
yft = abs(fft(y(1:1024),12800*30));
yft = yft / length(yft);
N = 1 : 12800*30; % 采样点数序列
f = 1/30*N; % 频率横坐标
figure(1);
plot(f(1:length(yft)/2) , yft(1:length(yft)/2));

% fft 1024 点 fft变换点数 12800*500
y = y -mean(y);
yft = abs(fft(y(1:1024),12800*500));
yft = yft / length(y);
N = 1 : 12800*500; % 采样点数序列
f = 1/500*N; % 频率横坐标
figure(1);
plot(f(1:length(yft)/2) , yft(1:length(yft)/2));

% fft 1024 点 fft变换点数 1024
y = y -mean(y);
yft = abs(fft(y(1:1024),1024));
yft = yft / length(y);
N = 1 : 1024; % 采样点数序列
f = 12800/1024*N; % 频率横坐标
figure(2);
plot(f(1:length(yft)/2) , yft(1:length(yft)/2));

总结:

可以看到

提高fft点数的确能够提高频谱的分辨率,但是这种效果有限

,只能提高一点点,最后一个频率分辨率很低,却是输入网络中进行训练的数据,这种识别有意义吗?

提高频率分辨率的方法:1.提高输入fft的信号长度2.对信号进行降采样,降低采样频率

提高分辨率训练效果前: 2048个点的序列 ->fft变换后->2048个点->截取一半1024个点输入网络1dcnn 训练准确率100% 测试准确率 97.8%

提高分辨率训练效果后:2048个点的序列-> fft变换 ->8192个点 ->截取一半 4096个点输入网络1dcnn 训练准确率 99% 测试准确率 93.5%

反而效果还变差了????



版权声明:本文为weixin_44417346原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。