matlab实现正弦内插算法(低通滤波)

一、 正弦内插概述

正弦内插算法,实质是对抽样信号的还原。

根据奈奎斯特定律,抽样频率大于原始信号的最大频率的两倍以上,则可以依据抽样后信号成功还原原始信号。而数字信号处理课程中学到,时域的离散化对应频域的周期化。通过低通滤波器,截取频域上的一个周期的函数,进行离散傅里叶反变换,即可还原原始波形。

二、正弦内插公式的推导

低通滤波器在频域上的图形表示如下,横坐标Ω为其数字角频率:

matlab实现正弦内插算法(低通滤波)_第1张图片

时域上的表达公式为:

{\color{Red} h[t]=\frac{1}{2\pi}\int_{-\pi}^{\pi}H_{LP}(e^{jwt})dw=\frac{1}{2\pi}\int_{-\pi}^{\pi}e^{jwt}dw=\frac{1}{2\pi}\int_{-\pi}^{\pi} (coswt-jsinwt)dw=\frac{sin(\pi t)}{\pi t}

转换成离散域,k=t/T, T采样时的采样间隔。

{\color{Red} h[k]=\frac{sin(\pi k)}{\pi k}=\frac{sin(\pi \frac{t}{T})}{\pi \frac{t}{T}}

低通滤波器,在频域上,为原始信号的频域响应与低通滤波频域响应函数的乘积,在时域上即为原始信号与低通滤波函数h[k]的卷积。

即y[k]=x[k]*h[k],其中x[k]为离散抽样后的函数,h[k]为低通滤波器的时域响应函数,y[k]为滤波后的函数。推导后得到:

        y[k]=x[k]*h[k]=\int_{-\infty }^{\infty }x[k]\cdot h[t-k]dt

由于从正负无穷大内的卷积在物理上不可实现,假设离散信号的采样周期为T,取前后合计M个离散采样点计算插值点,假设m为离散采样点的序号,则k=mT,因此将上述公式进行转化:

y[k]=x[k]*h[k]=\int_{-\infty }^{\infty }x[k]\cdot h[t-k]dt =\sum_{m=0}^{M-1}x[mT]\cdot h[t-mT]

        最终转化结果为:

           {\color{Red} y[k]=\sum_{m=0}^{M-1}x[mT]\cdot \frac{sin(\frac{\pi (t-mT)}{T})}{\pi \frac{(t-mT)}{T}}}

三、MATLAB正弦内插算法实现

依据此公式,使用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;

    

运行结果如下图。上侧为原始的离散函数,下侧为正弦内插插值后的波形。matlab实现正弦内插算法(低通滤波)_第2张图片

你可能感兴趣的:(MATLAB,信号处理原理,matlab,算法,python)