这学期开了一门数字信号处理,我对循环卷积这一内容十分感兴趣,就用C++实现了循环卷积的计算,欢迎各路大神的批评与指正。
C++代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100;
int h[N],x[N];
int y[N];
int L;
int n,m;
/*L点循环卷积*/
int X(int j)//x(n)以L为周期,但实际只存储了一个周期的x(n),因此出现不在存储范围内的x(n),需要映射到0~L - 1;
{
if(j >= 0)return x[j];
else if(j < 0)return x[(j + L)%L];
}
void circon()
{
for(int i = 0;i < L;i++)
{
cout<<"[ ";
for(int j = 0;j < L;j++)
{
y[i] += h[j] * X(i - j);
cout<<X(i - j)<<" ";
}
cout<<"] ";
cout<<"["<<h[i]<<"] ";
cout<<"["<<y[i]<<"]"<<endl;
}
}
int main()
{
int lmin;
cout<<"h(n)序列的个数为"<<endl;
cin >> n;
printf("请输入h(n)\n");
for(int i = 0;i < n;i++)scanf("%d",&h[i]);
cout<<"x(n)序列的个数为"<<endl;
cin >> m;
printf("请输入x(n)\n");
for(int i = 0;i < m;i++)scanf("%d",&x[i]);
lmin = m + n - 1;
printf("请输入L(L大于等于lmin:%d)\n",lmin);
cin >> L;
circon();//循环卷积
puts("");
return 0;
}
程序运行结果如下:
Matlab仿真: