Lio*_*gan 3 algorithm signal-processing
如何将基带采样信号从实值样本转换为复值样本(实数,虚数),反之亦然.
我的样本是整数,我正在寻找一种快速(但准确)的转换算法.
一个C++示例代码(真实的,不复杂的;-)将非常受欢迎.
编辑:非常欢迎IPP代码.
编辑:我正在寻找一种方法,可以将n个实数样本转换为n/2个复数样本,反之亦然,而不会影响带宽.
在想象中添加零是概念上你想要做的第一步.最初,您在频域中有一个真实的信号,如下所示:
[r0, r1, r2, r3, ...]
/-~--------\
DC +Fs/2
Run Code Online (Sandbox Code Playgroud)
如果你用零填充虚数值,你会发现你真的有正负频率作为镜像:
[r0 + 0i, r1 + 0i, r2 + 0i, r3 + 0i, ...]
/--------~-\ /-~--------\
-Fs/2 DC +Fs/2
Run Code Online (Sandbox Code Playgroud)
接下来,将时域中的信号乘以-Fs/4的复音(调谐信号).你的信号看起来像
----~-\ /-~--------\ /------
DC
Run Code Online (Sandbox Code Playgroud)
所以现在,你过滤掉中间的一半,你得到:
________/-~--------\________
DC
Run Code Online (Sandbox Code Playgroud)
然后你用两个结束,你最终得到:
/-~--------\
Run Code Online (Sandbox Code Playgroud)
这是你想要的.
所有这些步骤都可以在时域中有效地执行.如果你注意所有的中间步骤,你会注意到有很多地方你乘以0,+ 1,-1,+ i或-i.此外,半带低通滤波器将具有许多零和一些对称性.既然你知道你要用2来抽取,你只需要计算你想要保留的样本.如果你通过代数工作,你会找到很多地方来简化它,以实现干净和快速的实现.
最终,这完全等同于希尔伯特变换,但我认为当你将它分解成这样的碎片时更容易理解.
从复杂转换回真实是类似的.你会用其他每个样本的零填充它来撤消抽取.您将过滤复杂信号以删除刚刚介绍的别名.你将它调高Fs/4,然后丢掉虚构的组件.(对不起,我都是ascii-arted out ... :-)
请注意,此转换在边界附近有损.您必须使用无限长度过滤器来完美地完成它.