因此,我正在尝试编写一个频域内插器,将信号的频率响应零填充并进行逆变换。我必须处理两种情况:
- 均匀长度的响应- 由于模棱两可,因此必须拆分 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));
}
}
虚通道上的涟漪很小,但差不大:
由于您的地块已经缩小,因此很难看到。
—
杰森R
@Jason对不起,我以为他们已经链接了,所以我对html进行了调整,以便他们可以立即单击以放大尺寸。
—
gct
您是否有任何代码或示例文件可以用作输入内容?要记住的一件事是DFT假定的边界条件。具体而言,存在一个固有的假设,即感兴趣的信号是周期性的。因此,如果在奇数长度输入中的第一个样本和最后一个样本之间存在不连续性,那么您会看到像观察到的那样振铃。长度均匀的样本从头到尾可能会更连续,因此您看不到这种现象。
—
杰森R
我没有其他人可以轻松消化的格式的数据,但我认为您是对的。我刚到这里工作,重新编译了代码/重新生成了测试输入(1秒钟内有10Hz-100Hz的线性调频),然后重新运行了代码,但没有听到铃声。我看到了您的评论,并将频率更改为10-100.314,现在看到偶数和奇数变换都在响。
—
gct
您是否尝试过将窗口函数应用于数据?通常,这将减少振铃。
—
MarkSci 2015年