快速卷积实现思路
- 序列x(n)和h(n)的长差不多,设x(n)的长为N_1,h(n)的长为N_2,则
- 为使两有限长序列的线性卷积可用其循环卷积代替而不发生混叠,必须选择循环卷积长度N≥N_1+N_2-1,若采用基2-FFT完成卷积运算,要求N=2^m(m为整数)
- 用补零方法使x(n)和h(n)变成列长为N的序列
- 用FFT计算x(n)和h(n)的N点离散傅里叶变换
- 完成X(k)和H(k)乘积,Y(k)=X(k)H(k)
- 用FFT计算Y(k)的离散傅里叶反变换得
7. 此外,为防止当两个卷积项长度相差很大时,短序列需要补的0非常多,这样无助于计算量的减小,采用重叠相加法
DSP实现代码:
- 初始化部分:
int length(char file[]);
int DataIn1;
int DataIn2;
int DataOut;
int n;
int m;
int l = 512;
int i,j;
int k,p;
complex_float xi[N_FFT];
complex_float Y[N_FFT];
complex_float yn[N_FFT];
-
读取数据部分
-
实现快速卷积算法
-
测量读取数据长度的函数部分
实验结果:
为证实结果的准确性,我打算使用Matlab的conv线性卷积以及快速卷积算法来和本次的实验结果作对比,其结果如下所示:
误差分析:
完整DSP代码实现以及报告说明如下:
https://download.csdn.net/download/weixin_39589455/18656468