matlab实现离散傅里叶变换及低通滤波

如图传感器无滤波状态下FZ数据为下列
在这里插入图片描述
导入matlab使用工具箱分析图如下:
在这里插入图片描述

将数据导入matlab代码

clear;clc;close all
load('data_nofliter')
Fs=100;      % 采集频率
T=1/Fs;       % 采集时间间隔

%信号长度最好为偶数
N=length(data_z);  % 采集信号的长度

y = data_z; %将数据放入y向量

t=(0:1:N-1)*T;   % 定义整个采集时间点
t=t';            % 转置成列向量

% 绘制时域信号
figure
plot(t,y)
xlabel('时间')
ylabel('信号值')
title('时域信号')

% fft变换
Y=fft(y);          % Y为fft变换结果,复数向量
Y_half=Y(1:N/2+1);      % 只看变换结果的一半即可
A=abs(Y_half);          % 复数的幅值(模)
f=(0:1:N/2)*Fs/N;  % 生成频率范围
f=f';              % 转置成列向量

% 幅值修正
A_adj=zeros(N/2+1,1);
A_adj(1)=A(1)/N;       % 频率为0的位置
A_adj(end)=A(end)/N;   % 频率为Fs/2的位置
A_adj(2:end-1)=2*A(2:end-1)/N;

% 绘制频率幅值图
figure
subplot(3,2,1)
plot(f,A_adj)
xlabel('频率 (Hz)')
ylabel('幅值 (修正后)')
title('FFT变换幅值图')
grid on

% 绘制频谱相位图
subplot(3,2,2)
phase_angle=angle(Y_half);    % angle函数的返回结果为弧度
phase_angle=rad2deg(phase_angle); 
plot(f,phase_angle)
xlabel('频率 (Hz)')
ylabel('相位角 (degree)')
title('FFT变换相位图')
grid on

%%计算理想低通滤波器的频率响应
fc= 15;
H = zeros(length(f),1);
H(f<fc)=1;

HA = abs(H);
Hangle = angle(H);
Hangle = rad2deg(Hangle);  %将弧度转换为角度

subplot(3,2,3)
plot(f,HA,'m')
xlabel('频率(Hz)')
ylabel('H的幅值')
grid on

subplot(3,2,4)
plot(f,Hangle,'m')
xlabel('频率(Hz)')
ylabel('H的相位角')
grid on

%%计算输出信号的傅里叶变换
output_half = Y_half.*H;
output_halfA=abs(output_half );
% 幅值修正
output_halfA_adj=zeros(N/2+1,1);
output_halfA_adj(1)=output_halfA(1)/N;       % 频率为0的位置
output_halfA_adj(end)=output_halfA(end)/N;   % 频率为Fs/2的位置
output_halfA_adj(2:end-1)=2*output_halfA(2:end-1)/N;

subplot(3,2,5)
plot(f,output_halfA_adj,'r')
xlabel('频率 (Hz)')
ylabel('Y的幅值')
grid on

output_halfangle=angle(output_half);
output_halfangle=rad2deg(output_halfangle);  % 将弧度转换为角度,方便观察

subplot(3,2,6)
plot(f,output_halfangle,'r')
xlabel('频率 (Hz)')
ylabel('Y的相位角 (degree)')
grid on

%% 输出信号的半谱补全成全谱
second_half=output_half(2:end-1);
second_half=conj(second_half);
second_half=flip(second_half);
output=[output_half;second_half];

%% 对output做傅里叶反变换,得到时域输出信号y(t)
OUTPUT=ifft(output);

figure
plot(t,OUTPUT,'r')
xlabel('时间 /s')
ylabel('信号值')
title('时域输出信号 y(t)')
grid on


运行得到下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
低通滤波的频率为15HZ,数据抖动范围有所缩小。

猜你喜欢

转载自blog.csdn.net/weixin_42355349/article/details/84893971