matlab实现正弦内插算法(低通滤波) |
您所在的位置:网站首页 › matlab低通滤波器函数怎么用 › matlab实现正弦内插算法(低通滤波) |
一、 正弦内插概述
正弦内插算法,实质是对抽样信号的还原,利用低通滤波器的时域曲线对离散信号进行插值。 根据奈奎斯特定律,抽样频率大于原始信号的最大频率的两倍以上,则可以依据抽样后信号成功还原原始信号。而数字信号处理课程中学到,时域的离散化对应频域的周期化。通过低通滤波器,截取频域上的一个周期的函数,进行离散傅里叶反变换,即可还原原始波形。 二、正弦内插公式的推导低通滤波器在频域上的图形表示如下,横坐标Ω为其数字角频率: 时域上的函数图形表示如下: 时域上的表达公式为(傅里叶反变换): 对上式求积分可得: 写成sinc函数形式,即为: 低通滤波器,在频域上,为原始信号的频域响应与低通滤波频域响应函数的乘积,在时域上即为原始信号与低通滤波函数h[k]的卷积。 即y[t]=x[t]*h[t],其中x[t]为需要插值的函数,h[t]为低通滤波器的时域响应函数,y[k]为滤波后的函数,即插值后的函数。卷积公式: 由于从正负无穷大内的卷积在物理上不可实现,假设插值后的离散信号的采样点的间隔周期为T,取前后合计N个离散采样点进行滤波,完成插值;假设n为离散采样点的序号,则t=nT(需要注意,x[t]的原始点保持不变,其余点置为0),因此将上述公式进行转化: 代入 我们知道采样频率 因此有
当 上述公式中,仅有2个参数:采样间隔T和插值点数n。(个人认为 依据此公式,使用matlab实现正弦内插的代码如下: %sinx/x正弦内插算法实现 a=1; %首先模拟一个离散的正弦函数 discrete_NUM = 20;%离散函数的点数共计20个 fm=zeros(discrete_NUM,1); for m=1:1:discrete_NUM fm(m)=sin(0.2*pi*m);%生成正弦离散函数 end subplot(2,1,1); stem(fm);%正弦离散函数画图展示 hold on; %正弦内插实现 interpolation_ratio = 10;%每个离散点插入10个点 after_NUM = discrete_NUM * interpolation_ratio;%插值后的波形的点数,一共200个点 y_o=zeros(after_NUM,1);%输出函数的幅度值矩阵 t_o=zeros(after_NUM,1);%输出函数的时间值矩阵 for t=0:1:after_NUM-1 %t取值范围为1~200 if(mod(t,interpolation_ratio)==0) %原始离散数据位置,不计算,直接赋值 t_o(t+1)=1+t/interpolation_ratio;%时间值,横坐标,t取值范围是1~200 y_o(t+1)=fm(1+t/interpolation_ratio);%最终输出的幅度值 t取值范围是1~200 else y=0; for m=1:1:discrete_NUM x= pi*(t-m*interpolation_ratio)/interpolation_ratio; % ,映射离散函数的采样周期为interpolation_ratio,t为插值对应的时间,每个单位映射为1 if(x==0) %x=0时,sinx/x无意义,赋值1 y=y+fm(m)*1; else y=y+fm(m)*sin(x)/x;%计算出每一个点内插数值 end %或者表达为sinc(x)的形式 % x= (t-m*interpolation_ratio)/interpolation_ratio; % ,映射离散函数的采样周期为interpolation_num,t为插值对应的时间,每个单位映射为采样周期的1/interpolation_num % y=y+fm(m)*sinc(x);%计算出每一个点内插数值 end t_o(t+1)=t/10;%时间值,横坐标,t取值范围是1~200 y_o(t+1)=y;%最终输出的幅度值,纵坐标 t取值范围是1~200 end end subplot(2,1,2); stem(t_o,y_o);%显示插值之后的波形 hold on;运行结果如下图。上侧为原始的离散函数,下侧为正弦内插插值后的波形。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |