C程序看不太懂,求讲解

xhmstory 2013-09-12 08:48:35
整体程序:
// 长序列的快速卷积
// 用重叠保留法计算一个长序列和一个短序列的快速卷积。通常用于数字滤波
// x--双精度一维数组,长度为len。开始时存放长序列x(i), 最后存放线性卷积的值
// h--双精度一维数组,长度为m。存放短序列h(i).
// len--整形变量。长序列x(i)的长度。
// m--整形变量。短序列h(i)的长度。
// n--整形变量。对长序列x(i)进行分段的长度。一般选取n大于段序列h(i)长度m的两倍以上,
// 切必须是2的整数次幂,即n = pow(2, s);
void convols(double x[], double h[], int len, int m, int n)
{
int i, j, i1, n2, num, nblks;
double t;
double *r, *s;
r = (double*)malloc(n * sizeof(double));
s = (double*)malloc((n - m + 1) * sizeof(double));
n2 = n / 2;
num = n - m + 1;
nblks = (int)floor((len - n + m) / (double) num) + 1;
// h[i] 补零
for (i = m; i < n; i++)
{
h[i] = 0.0;
}
// 计算h的fft
rfft(h, n);

for ( j = 0; j < nblks; j++)
{
if (j == 0)
{
for (i = 0; i < (m-1); i++)
{
r[i] = 0.0;
}
for (i = (m-1); i < n; i++)
{
i1 = i - m + 1;
r[i] = x[i1];
}
}
else
{
for (i = 0; i < n; i++)
{
i1 = i + j * num - m + 1;
r[i] = x[i1];
}
for (i = 0; i < num; i++)
{
i1 = i + ( j - 1) * num;
x[i1] = s[i];
}
}
rfft(r, n);
r[0] = r[0] * h[0];
r[n2] = r[n2] * h[n2];
for (i = 1; i < n2; i++)
{
t = h[i] * r[i] - h[n-i] * r[n - i];
r[n - i] = h[i] * r[n - i] + h[n - i] * r[i];
r[i] = t;
}
irfft(r, n);
for ( i = (m - 1); i < n; i++)
{
i1 = i - m + 1;
s[i1] = r[i];
}
}
for ( i = 0; i < num; i++)
{
i1 = i + (j - 1) * num;
x[i1] = s[i];
}

i1 = j * num;
for (i = i1; i < len; i++)
{
x[i] = 0.0;
}

free(r);
free(s);
}

请问
for (i = 1; i < n2; i++)
{
t = h[i] * r[i] - h[n-i] * r[n - i];
r[n - i] = h[i] * r[n - i] + h[n - i] * r[i];
r[i] = t;
}
这几句是什么意思,为什么频域相乘这么复杂?只有这么多分了,求讲解
程序中的rfft和irfft是做傅里叶变换和反变换
...全文
202 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuchuan53 2013-09-15
  • 打赏
  • 举报
回复
一般这种充斥各种x,h,m,n,i,j…变量的、不按代码插入未缩进对齐的、看起来一大堆的、数学计算的、没有讲明原理的……都没人理。
xhmstory 2013-09-15
  • 打赏
  • 举报
回复
呵呵,谢谢你们的提醒,下次发帖我会注意,我自己弄懂啦~
Universe_Admin 2013-09-13
  • 打赏
  • 举报
回复
先弄清楚傅里叶变换和反变换的公式

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧