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,数据抖动范围有所缩小。

  • 14
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
离散傅里叶变换(DFT)是将离散信号转换为频域信号的一种方法。基于DFT的频率域滤波法是指在频域对信号进行滤波,然后再将滤波后的信号通过逆DFT转换回时域信号。 在MATLAB中,可以使用fft函数进行DFT计算,使用ifft函数进行逆DFT计算。具体实现步骤如下: 1.读取图像,并将其转换为灰度图像。 2.使用fft函数计算图像的DFT,得到频域图像。 3.构造滤波器,可以选择使用低通、高通、带通、带阻等滤波器。 4.将滤波器转换为与频域图像相同的大小,并将其与频域图像相乘,得到滤波后的频域图像。 5.使用ifft函数计算滤波后的频域图像的逆DFT,得到时域图像。 下面是一个简单的MATLAB代码示例,实现对灰度图像的低通滤波: % 读取图像 img = imread('lena.jpg'); % 转换为灰度图像 img = rgb2gray(img); % 计算图像的DFT dft_img = fft2(double(img)); % 构造低通滤波器 [M, N] = size(img); H = zeros(M, N); D0 = 50; for u = 1:M for v = 1:N D = sqrt((u-M/2)^2 + (v-N/2)^2); if D <= D0 H(u, v) = 1; end end end % 将滤波器转换为与频域图像相同的大小 H = fftshift(H); % 将滤波器与频域图像相乘 filtered_img = dft_img .* H; % 计算滤波后的图像的逆DFT result_img = real(ifft2(filtered_img)); % 显示原始图像和滤波后的图像 subplot(1, 2, 1); imshow(img); title('原始图像'); subplot(1, 2, 2); imshow(result_img, []); title('低通滤波后的图像'); 在实际应用中,可以根据需要选择不同的滤波器和滤波参数,以达到滤波效果的优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值