所以我正在尝试编写一个频域插值器,它对信号的频率响应和逆变换进行零填充。我必须处理两种情况:
- 偶数响应 - 必须拆分bin 因为它是模棱两可的。所以我复制了频谱的负部分,并
n*(interp-1)-1
在两者之间添加了零。 - 奇数响应 - 没有bin 所以只需拆分正/负频率并
n*(interp-1)
在它们之间插入零。
可以在这里看到执行零填充的代码
// Copy negative frequency components to end of buffer and zero out middle
// inp - input buffer of complex floats
// n - transform size
// interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
if ((n % 2) == 0) {
memmove(inp + n*interp - n/2, inp + n/2, n/2*sizeof(cfloat_t));
memset (inp + n/2 + 1, 0, (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero
inp[n/2] /= 2.0;
inp[n*interp-n/2] /= 2.0;
} else {
memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
memset (inp + (n+1)/2, 0, (n*(interp-1))*sizeof(cfloat_t));
}
}
第一种情况工作正常,我在啁啾信号上测试它,它插值很好,有一点数字噪声,但它通过 FFT 往返,所以你能做什么(首先信号显示左右):
问题在于奇数长度变换,我只在真实样本上得到了非常令人发指的瞬态响应(再次,真实的):
想象中的通道上有一个小涟漪,但没有那么糟糕:
这就像我搞砸了我的bin 在奇怪的情况下,但没有斌,所以我很不解。有人有什么想法吗?