使用matlab进行傅里叶分析和滤波
傅里叶分析
公式法
下例 是将振幅为1的5Hz正弦波和振幅为0.5的10Hz正弦波相加之后进行傅里叶分析。
clear all
N=512;
dt=0.02;
n=0:N-1;
t=n*dt;
x=sin(2*pi*5*t)+0.5*sin(2*pi*10*t);%生成和信号
%傅里叶变换
m = floor(N/2)+1;
a=zeros(1,m);
b=zeros(1,m);
for k=0:m-1
for ii=0:N-1
a(k+1) = a(k+1)+2/N*x(ii+1)*cos(2*pi*k*ii/N);
b(k+1) = b(k+1)+2/N*x(ii+1)*sin(2*pi*k*ii/N);
end
c(k+1)=sqrt(a(k+1).^2+b(k+1).^2);
end
%傅里叶逆变换
if(mod(N,2) ~=1)
a(m)=a(m)/2;
end
for ii=0:N-1
xx(ii+1)=a(1)/2;
for k=1:m-1
xx(ii+1)=xx(ii+1)+a(k+1)*cos(2*pi*k*ii/N)+b(k+1)*sin(2*pi*k*ii/N);
end
end
%绘图
subplot(3,1,1),plot(t,x,'LineWidth',2);title('原始信号'),xlabel('时间/s');
subplot(3,1,2),plot((0:m-1)/(N*dt),c,'LineWidth',2);title('傅里叶变换'),xlabel('频率/Hz');
subplot(3,1,3),plot((0:N-1)*dt,xx,'LineWidth',2);title('合成信号'),xlabel('时间/s');
运行结果如下所示:
快速傅里叶
matlab中的快速傅里叶有两种调用形式:
y=fft(x)
。x是原始信号,y是变换之后的信号。y与x有相同的长度。y=fft(x,N)
。x,y定义如上,N是正整数,表示进行N点快速傅里叶变换。如果x长度小于N,则对x补零,使之与N相等;反则,则对x进行截取。
对应的逆变换有两种,分别为x=ifft(y)
和x=ifft(y.N)
。
一般而言,N点fft的结果y,在$n=N/2+1$处对应的频率为最高采样率的一半,y的后一半与前一半对称。
下例 是将振幅为1的5Hz正弦波和振幅为0.5的10Hz正弦波相加之后进行傅里叶分析。
clc;clear;
fs=30;
N=512;
n=0:N-1;
t=n/fs;
x=sin(2*pi*5*t)+0.5*sin(2*pi*10*t);
%快速傅里叶
y=fft(x,N);
mag = abs(y);%振幅
ang = angle(y);%相位
f = n*fs/N;%横轴各点对应的频率值
%逆变换
xx = ifft(y);
xx = real(xx);%计算误差使得xx可能是复数,对其取实部得到信号
tt = [0:length(xx)-1]/fs;%横轴各点对应的时间
结果图省略。
滤波
利用快速傅里叶简单滤波
下例是将振幅为1的5Hz正弦波和振幅为0.5的10Hz正弦波相加之后,滤除8Hz以上的信号。
clc;clear;
fs=30;%采样率
N=256;
n=0:N-1;
t=n/fs;
dt=1/fs;
x=sin(2*pi*5*t)+0.5*sin(2*pi*10*t);
%快速傅里叶
y=fft(x,N);
mag = abs(y)*2/N;%振幅
ang = angle(y);%相位
f = n*fs/N;%横轴各点对应的频率值
%滤波
nn=length(y);
yy = zeros(1,nn);
for m=0:nn-1
if(m/(nn*dt)>8)&(m/(N*dt)<(1/dt-8))
yy(m+1)=0;
else
yy(m+1)=y(m+1);
end
end
%逆变换
xx = ifft(yy);
xx = real(xx);%计算误差使得xx可能是复数,对其取实部得到信号
tt = [0:length(xx)-1]/fs;%横轴各点对应的时间
%绘图
subplot(2,1,1),plot(t,x,'LineWidth',2);title('原始信号'),xlabel('时间/s');
subplot(2,1,2),plot(tt,xx,'LineWidth',2);title('滤波后的信号'),xlabel('时间/s');
结果如下图
几个简单的函数
xi=filtic(B,A,ys)
。B、A分别为系统z变换后的传递函数的分子和分母多项式的系数向量,ys是系统的初始输出状态,xi为对应的初始条件下输入序列。yn0=filter(B,A,xn)
。B、A定义同上,xn是系统的输入信号,yn0为系统的零状态响应。yn=filter(B,A,xn,xi)
。B、A、xn、xi定义同上,yn为系统全响应。
模拟滤波器
以巴特沃斯低通滤波器为例,说明调用方法。
[btt1,ctt1] = butter(N,wn,'s');%1.调用函数生成滤波器系数
H = [tf(btt1,ctt1)];%滤波器的传递函数
t = (0:n-1)./fs;%时域信号横轴的坐标,n为长度,fs为采样率
s1 = lsim(H,a1,t);%2.滤波
说明:
[btt1,ctt1] = butter(N,wn,'s');
。N是滤波器的阶数,wn是截止频率(是弧度值,如果截止频率要求为500Hz,则$wn=5002\pi$)。可以直接给定,亦可以根据参数由buttord`函数计算得到。's'表示模拟滤波器。btt1、ctt1分别表示滤波器在拉普拉斯域中传递函数的分子、分母多项式的系数。s1 = lsim(H,a1,t)
。H是模拟滤波器的传递函数,a1表示待滤波信号,t是信号的横坐标,s1是滤波后的信号。
其他说明:
- 这里仅以低通滤波器为例,其他巴特沃斯滤波器如高通、带通、带阻调用方式类似,只是函数
butter
的参数略有不同,请参看matlab关于butter函数的介绍。(在matlab中执行help butter
) - 其他滤波器,如椭圆滤波器等,使用方式类似,只是函数名称不同。
数字滤波器
以巴特沃斯低通滤波器为例,说明调用方法。
%方式一:直接设计
[btt,ctt] = butter(N,wn);%1.生成数字滤波器
Signal_Filter=filter(btt,ctt,a1);%2.滤波
%方式二:模拟滤波器转数字滤波器
[btt1,ctt1] = butter(N,Wn,'s');
[btt1,ctt1]=bilinear(btt1,ctt1,Fs);%3.模拟滤波器转数字滤波器
Signal_Filter=filter(btt,ctt,a1);
说明:
[btt,ctt] = butter(N,wn)
。N是滤波器阶数,wn是相对截止频率,比如最高采样率为Fs,要求的截止频率为fs,则$wn=fs/Fs$ 。可以直接给定,亦可以根据参数由buttord
函数计算得到。注意,这里没有参数's'。btt、ctt分别表示滤波器在z域中传递函数的分子、分母多项式的系数。Signal_Filter=filter(btt,ctt,a1)
。btt、ctt与之前定义相同,a1是待滤波信号,Signal_Filter是滤波之后的信号。[btt1,ctt1]=bilinear(btt1,ctt1,Fs)
。是使用双线性法将模拟滤波器在拉普拉斯域中的系数转换成数字滤波器在z域中的系数,Fs是采样率。
其他说明:
- 这里仅以低通滤波器为例,其他巴特沃斯滤波器如高通、带通、带阻调用方式类似,只是函数
butter
的参数略有不同,请参看matlab关于butter函数的介绍。(在matlab中执行help butter
) - 其他滤波器,如椭圆滤波器等,使用方式类似,只是函数名称不同。
使用matlab进行傅里叶分析和滤波的更多相关文章
- 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现
基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1. 背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...
- [整理]Matlab之中心平滑滤波
滑动平均(moving average):在地球物理异常图上,选定某一尺寸的窗口,将窗口内的所有异常值做算术平均,将平均值作为窗口中心点的异常值.按点距或线距移动窗口,重复此平均方法,直到对整幅图完成 ...
- 基于MATLAB的中值滤波算法实现
在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被广 ...
- matlab做gaussian高斯滤波
原文链接:https://blog.csdn.net/humanking7/article/details/46826105 核心提示 在Matlab中高斯滤波非常方便,主要涉及到下面两个函数: 函数 ...
- Matlab图像处理——中值滤波medfilt2问题解决
本文链接:https://blog.csdn.net/Pxzly1117/article/details/79201772程序: I=imread('13.jpg');%读入图像imshow(I);h ...
- 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)
1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤 ...
- matlab中滤波函数
matlab自带滤波器函数小结(图像处理) 1 线性平滑滤波器 用MATLAB实现领域平均法抑制噪声程序: I=imread(' c4.jpg '); subplot(231) imshow(I) ...
- matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波
来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...
- 基于暗通道优先算法的去雾应用(Matlab/C++)
基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理: 参见论文:Single Image Haze Removal Using Dark Channel Pri ...
随机推荐
- 入门大数据---Python基础
前言 由于AI的发展,包括Python集成了很多计算库,所以淡入了人们的视野,成为一个极力追捧的语言. 首先概括下Python中文含义是蟒蛇,它是一个胶水语言和一个脚本语言,胶水的意思是能和多种语言集 ...
- python自学之基础知识
python学习笔记 列表的添加拓展 列表的批量添加 用for循环可以批量添加 list=['李雷雷','韩梅梅',180,110] for i in rang(3): list.append(i) ...
- vue全家桶(4.3)
5.3.Vuex的核心概念 store: 每一个 Vuex 应用的核心就是 store(仓库)."store"基本上就是一个容器,它包含着你的应用中大部分的状态 (state) s ...
- 001_Linux常用命令之ls命令
1. 认识Linux系统目录结构 /bin 可执行文件所在目录 /media 挂载设备媒体,u盘,光驱等 /mnt 该目录主要是为了让用户挂在别的文件系统(挂在自己的u盘) /usr unix sys ...
- 你知道Redis可以实现延迟队列吗?
最近,又重新学习了下Redis,深深被Redis的魅力所折服,我才知道Redis不仅能快还能慢(我想也这么优秀o(╥﹏╥)o),简直是个利器呀. 咳咳咳,大家不要误会,本文很正经的啦! 好了,接下来回 ...
- 在 XUnit 中使用依赖注入
在 XUnit 中使用依赖注入 Intro 之前写过一篇 xunit 的依赖注入相关的文章,但是实际使用起来不是那么方便 今天介绍一个基于xunit和微软依赖注入框架的"真正"的依 ...
- HTML5(七)Web 存储
HTML5 Web 存储 HTML5 web 存储,一个比cookie更好的本地存储方式. 什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据. 早些时候,本地存储使用的是 ...
- mysql 时间自动更新问题
万恶的根据当前时间戳更新,有时候会自动更新,有时候又不会. 通过navicat 创建datetime类型的字段时,会自动勾选上根据当前时间戳更新.当更新数据的时候勾上这个的字段时间就会更改为当前的时间 ...
- Re5ilio 5ync:资源神器
文章目录 #0x0 简单的介绍 #0x1 安装使用 #0x10 下载 #0x11 安装 #0x12 升级pro权限 #0x13 开始添加资源 #0x14 后续 一定要小心哦!! #0x0 简单的介绍 ...
- JVM 专题六:运行时数据区(一)概述
1. 运行时数据区架构图 2. 内存 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略, ...