DSP

DSP卷积算法

2019-07-13 10:10发布

class="markdown_views prism-atom-one-light"> 卷积和(简称卷积)是信号处理中常用的算法之一。数字卷积运算通常采用两种方法:线性卷积和圆卷积。为了能使卷积运算在C54x系列DSP上的实现方法,首先要对数字卷积的基本概念作深入了解。使大家从根本上掌握卷积的实现方法,我们以模拟信号的卷积和数字信号的卷积为主,以及他们在C54x系列DSP上的实现方法。
1.卷积的基本原理和公式
卷积和:Y(n)= ∑X(m)H(n−m)=X(n)*H(n) m=−∞
对离散系统“卷积和”也是求线性时不变系统输出响应(零状态响应)的主要方法。
2.卷积和的运算在图形的表示
可分为四步:
A) 翻褶 现在亚变量坐标M上作出X(m)和H(m),将m=0的垂直轴为轴翻褶成H(-m)。
B) 移位 将H(-m)移位n,即得H(n-m)。当n为正整数时,右移n位。当n为负整数时,左移n位。
C) 相乘 再将H(n-m)和X(m)的相同m值的对应点值相乘。
D) 相加 把以上所有点的对应点的乘积叠加起来,即得Y(n)值。
依上法,取n=……,-2,-1,0,1,2,3,……各值,即可得全部Y(n)值。 设计总框图
这里写图片描述 当程序成功运行通过后,通过仿真器(XDS510或者XDS560)与目标板连接,安装仿真器驱动,然后load program到目标板,运行,利用仿真器提供的RTDX可实时查看存储器和寄存器变化。 程序流程图
这里写图片描述 程序中函数
processing1(int *input2, int *output2)
调用形式:processing1(int *input2, int *output2)
参数解释:intput2、output2为两个整型指针数组。
返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。
功能说明:对输入的input2 buffer波形进行截取m点,再以零点的Y轴为对称轴进行翻褶,把生成的波形上的各点的值存入以OUTPUT2指针开始的一段地址空间中。
processing2(int *output2, int *output3)
调用形式:processing2(int *output2, int *output3)
参数解释:output2、output3为两个整型指针数组。
返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。
功能说明:对输出的output2 buffer波形进行作n点移位,然后把生成的波形上的各点的值存入以OUTPUT3指针开始的一段地址空间中。
processing3(int *input1,int *output2,int *output4)
调用形式:processing3(int *input1,int *output2,int *output4)
参数解释:output2、output4、input1为三个整型指针数组。
返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。
功能说明:对输入的input2 buffer波形和输入的input1 buffer作卷积和运算,然后把生成的波形上的各点的值存入以OUTPUT4指针开始的一段地址空间中。
processing4(int *input2,int *output1)
调用形式:processing4(int *input2,int *output1)
参数解释:output1、input2为两个整型指针数组。
返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。
功能说明:对输入的input2 buffer波形截取m点,然后把生成的波形上的各点的值存入以OUTPUT1指针开始的一段地址空间中。 程序代码 #include #include "volume.h" int in1_buffer[BUFSIZE]; int in2_buffer[BUFSIZE]; int out1_buffer[BUFSIZE]; int out2_buffer[BUFSIZE]; int out3_buffer[BUFSIZE]; int out4_buffer[BUFSIZE*2]; int size = BUFSIZE; int ain = MINGAIN; int zhy=0; int sk=64; /* Functions */ static int step1(int *output1, int *output2); static int step2(int *output2, int *output3); static int step3(int *input1,int *output2,int *output4); static int step4(int *input2, int *output1); static void dataIO1(void); static void dataIO2(void); void main() { int *input1 = &in1_buffer[0]; int *input2 = &in2_buffer[0]; int *output1 = &out1_buffer[0]; int *output2 = &out2_buffer[0]; int *output3 = &out3_buffer[0]; int *output4 = &out4_buffer[0]; puts("volume example started "); while(TRUE) { /* * Read input data using a probe-point connected to a host file. * Write output data to a graph connected through a probe-point. */ dataIO1(); // break point dataIO2(); // break point step4(input2,output1); step1(output1, output2); step2(output2, output3); step3(input1,output2,output4) ; } } static int step4(int *input2,int *output1) { int m=sk; for(;m>=0;m--) { *output1++ = *input2++ * ain; } for(;(size-m)>0;m++) { output1[m]=0; } return(TRUE); } static int step1(int *output1,int *output2) { int m=sk-1; for(;m>0;m--) { *output2++ = *output1++ * ain; } return(TRUE); } static int step2(int *output2, int *output3) { int n=zhy; size=BUFSIZE; for(;(size-n)>0;n++) { *output3++ = output2[n]; } return(TRUE); } static int step3(int *input1,int *output2,int *output4) { int m=sk; int y=zhy; int z,x,w,i,f,g; for(;(m-y)>0;) { i=y; x=0; z=0; f=y; for(;i>=0;i--) { g=input1[z]*output2[f]; x=x+g; z++; f--; } *output4++ = x; y++; } m=sk; y=sk-1; w=m-zhy-1; for(;m>0;m--) { y--; i=y; z=sk-1; x=0; f=sk-y; for(;i>0;i--,z--,f++) { g=input1[z]*output2[f]; x=x+g; } out4_buffer[w]=x; w++; } return(TRUE); } static void dataIO1() { /* do data I/O */ return; } static void dataIO2() { /* do data I/O */ return; }