7利用DSP利用C语言和汇编设计实现IIR低通滤波器设计要求:信息信号: signal=sin2pislnT高频噪声:noise =05sin2pins1nT混合信号:x=signal+noise其中sl=1000Hzns1=4500Hz采样频率为10000HzT=110000。混合信号波形为滤波器输入信号波形信息信号波形为输出信号波形
要求设计一个IIR低通滤波器,实现对高频噪声的滤波,使得输出信号中只包含信息信号的成分。
设计流程如下:
1.确定滤波器的截止频率。由于信息信号的频率为1000Hz,而高频噪声的频率为4500Hz,因此选择截止频率为2000Hz,以确保能够滤除高频噪声。
2.选择合适的滤波器类型。由于要设计低通滤波器,因此选择Butterworth滤波器,因为它具有平坦的通带和陡峭的阻带,能够有效滤除高频噪声。
3.确定滤波器的阶数。选择二阶滤波器,因为它具有良好的性能和较少的计算量。
4.计算滤波器的系数。利用Matlab等工具计算滤波器的系数,得到如下二阶IIR低通滤波器的系数:
b0=0.001950231683839, b1=0.003900463367678, b2=0.001950231683839 a1=-1.911937747195649, a2=0.914975880767064
5.编写C语言和汇编程序。将滤波器的系数写入程序中,读入混合信号x,利用二阶IIR滤波器进行滤波,得到输出信号y,输出y即为信息信号的波形。
C语言程序如下:
#include <stdio.h> #include <stdlib.h> #include <math.h>
#define PI 3.141592653589793
float b[3]={0.001950231683839, 0.003900463367678, 0.001950231683839}; float a[3]={1.000000000000000, -1.911937747195649, 0.914975880767064};
float x[3]={0.0, 0.0, 0.0}; float y[3]={0.0, 0.0, 0.0};
float signal(float n) { float sl=1000.0; float T=1.0/10000.0; return sin(2.0PIslnT); }
float noise(float n) { float ns1=4500.0; float T=1.0/10000.0; return 0.5sin(2.0PIns1n*T); }
float filter(float xin) { float yout=b[0]*xin+b[1]*x[1]+b[2]*x[0]-a[1]*y[1]-a[2]*y[0]; x[0]=x[1]; x[1]=xin; y[0]=y[1]; y[1]=yout; return yout; }
int main() { float T=1.0/10000.0; int nsamples=10000; float n=0.0; for(int i=0;i<nsamples;i++) { float s=signal(n); float n=noise(n); float xin=s+n; float yout=filter(xin); printf("%f\n",yout); n+=T; } return 0; }
汇编程序如下:
.model small .stack 100h .data b0 dw 0.00195023168383932768 b1 dw 0.00390046336767832768 b2 dw 0.00195023168383932768 a1 dw -1.91193774719564932768 a2 dw 0.914975880767064*32768 x dw 0,0,0 y dw 0,0,0 .code start: mov ax,@data mov ds,ax mov es,ax mov cx,10000 mov dx,0 mov si,0 mov bx,0 loop1: call signal mov bx,ax call noise add ax,bx call filter mov bx,ax mov ah,4ch int 21h signal: push ax push bx push cx push dx push si push di mov si,dx mov ax,si mov bx,1000 mul bx mov bx,ax mov ax,0 mov cx,0 mov dx,0 mov si,0 mov di,0 mov ax,bx mov bx,0 mov cx,10000 div cx mov cx,ax mov ax,bx mov dx,0 fld PI fmul ax fmul 2.0 fsin fstp ax pop di pop si pop dx pop cx pop bx pop ax ret noise: push ax push bx push cx push dx push si push di mov si,dx mov ax,si mov bx,4500 mul bx mov bx,ax mov ax,0 mov cx,0 mov dx,0 mov si,0 mov di,0 mov ax,bx mov bx,0 mov cx,10000 div cx mov cx,ax mov ax,bx mov dx,0 fld PI fmul ax fmul 2.0 fsin fmul 0.5 fmul 32768.0 fistp ax pop di pop si pop dx pop cx pop bx pop ax ret filter: push ax push bx push cx push dx push si push di mov si,dx mov ax,si mov bx,[x+2] mov [x],bx mov bx,[x+2] mov [x+1],bx mov bx,ax mov [x+2],bx mov bx,[y+2] mov [y],bx mov bx,[y+2] mov [y+1],bx mov bx,ax mov dx,[b0] imul dx mov bx,[x+2] imul bx mov cx,[b1] imul cx add dx,cx mov bx,[x] imul bx mov cx,[b2] imul cx add dx,cx mov bx,[y+2] imul bx mov cx,[a1] imul cx sub dx,cx mov bx,[y] imul bx mov cx,[a2] imul cx sub dx,cx sar dx,15 mov ax,dx pop di pop si pop dx pop cx pop bx pop ax ret end star
原文地址: http://www.cveoy.top/t/topic/hmUC 著作权归作者所有。请勿转载和采集!