C程序看不太懂,求讲解
整体程序:
// 长序列的快速卷积
// 用重叠保留法计算一个长序列和一个短序列的快速卷积。通常用于数字滤波
// 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是做傅里叶变换和反变换