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

一、 正弦内插概述

        正弦内插算法,实质是对抽样信号的还原,利用低通滤波器的时域曲线对离散信号进行插值。

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

二、正弦内插公式的推导

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

时域上的函数图形表示如下:

时域上的表达公式为(傅里叶反变换):

{\color{Red} h[t]=\frac{1}{2\pi}\int_{-\pi}^{\pi}H_{LP}(e^{jw t})dw=\frac{1}{2\pi}\int_{-w_{c}}^{w_{c}}(e^{jw t})dw =\frac{1}{2\pi}\int_{-w_{c}}^{w_{c}} (cosw t-jsinw t)dw

对上式求积分可得:

h[t] = \frac{1}{2\pi}\int_{-w_{c}}^{w_{c}} (cosw t-jsinwt)dw=\frac{1}{2\pi}(\frac{1}{t}sinwt+j\frac{1}{t}cosw t)\left.\begin{matrix} \\ \end{matrix}\right|\begin{matrix} \\w_{c} \\ \\ -w_{c} \\ \\ \end{matrix} =\frac{1}{2\pi t}( sinw_{c} t +jcosw_{c} t + sinw_{c} t -jcosw_{c} t) ) = \frac{sinw_{c} t}{\pi t}

写成sinc函数形式,即为: {\color{Red} h[t]= \frac{sinw_{c} t}{\pi t} = \frac{w_{c}}{\pi}Sa(w_{c}t)}         备注:Sa(t)=\frac{sin(t)}{t}


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

        即y[t]=x[t]*h[t],其中x[t]为需要插值的函数,h[t]为低通滤波器的时域响应函数,y[k]为滤波后的函数,即插值后的函数。卷积公式: y[t]=x[t]*h[t]=\int_{-\infty }^{\infty }x[\imath ]\cdot h[t-\imath]d\imath

        由于从正负无穷大内的卷积在物理上不可实现,假设插值后的离散信号的采样点的间隔周期为T,取前后合计N个离散采样点进行滤波,完成插值;假设n为离散采样点的序号,则t=nT(需要注意,x[t]的原始点保持不变,其余点置为0),因此将上述公式进行转化:

y[t]=x[t]*h[t]=\int_{-\infty }^{\infty }x[\imath]\cdot h[t-\imath ]d\imath =\sum_{n=0}^{N-1}x[nT]\cdot h[t-nT]

代入h[t]= \frac{sinw_{c} t}{\pi t} = \frac{w_{c}}{\pi}Sa(w_{c}t)可得:

{\color{Red} y[t]=\sum_{n=0 }^{N-1}x[nT]\frac{w_{c}Tsin(w_{c}(t-nT))}{\pi w_{c}(t-nT)}=\sum_{n=0 }^{N-1}x[nT]\frac{sin(w_{c}(t-nT))}{\frac{\pi}{T} (t-nT)}}

        我们知道采样频率fs=1/T,采样角频率w_{s}=2\pi f_{s}=2\pi/T,而根据采样定理,w_{s}>=2w_{c},因此wc<=w_{s}/2 = pi/T

 因此有

 

w_{c} = \pi/T时,公式写成下式:

上述公式中,仅有2个参数:采样间隔T和插值点数n。(个人认为w_{c} < \pi/T的其余值也可,此处按照w_{c} = \pi/T简单,不同的wc即选取了不同的低通滤波器而已)

三、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;

    

运行结果如下图。上侧为原始的离散函数,下侧为正弦内插插值后的波形。

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MATLAB中,可以使用以下代码对正弦波进行低通滤波: ```matlab clear; clc; n = 0:79; xn = 2*sin(0.05*pi.*n); % 正弦波信号 fc = 0.1; % 截止频率 fs = 1; % 采样频率 \[b, a\] = butter(2, fc/(fs/2)); % 二阶巴特沃斯低通滤波器设计 yn = filter(b, a, xn); % 低通滤波 stem(n, yn, '.'); % 绘制滤波后的信号 xlabel('n'); ylabel('y(n)'); title('低通滤波后的正弦信号'); ``` 在这段代码中,首先定义了正弦波信号`xn`,然后通过`butter`函数设计了一个二阶巴特沃斯低通滤波器,截止频率为`fc`,采样频率为`fs`。接下来使用`filter`函数正弦波信号进行低通滤波,得到滤波后的信号`yn`。最后使用`stem`函数绘制滤波后的信号。 请注意,这里的截止频率`fc`是相对于采样频率`fs`的归一化频率,取值范围为0到1。如果需要具体的截止频率,可以根据采样频率和所需的截止频率计算得到。 #### 引用[.reference_title] - *1* *2* [低通滤波与RC振荡产生正弦波](https://blog.csdn.net/qq_46554815/article/details/114049681)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [练习题:带噪声的正弦信号通过低通滤波器后的输出(MATLAB解答)](https://blog.csdn.net/weixin_44117735/article/details/120706672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值