DSP - 将采样信号从实际样本转换为复杂样本,反之亦然

Lio*_*gan 3 algorithm signal-processing

如何将基带采样信号从实值样本转换为复值样本(实数,虚数),反之亦然.

我的样本是整数,我正在寻找一种快速(但准确)的转换算法.

一个C++示例代码(真实的,不复杂的;-)将非常受欢迎.

编辑:非常欢迎IPP代码.

编辑:我正在寻找一种方法,可以将n个实数样本转换为n/2个复数样本,反之亦然,而不会影响带宽.

xsc*_*ott 9

在想象中添加零是概念上你想要做的第一步.最初,您在频域中有一个真实的信号,如下所示:

           [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 ... :-)

请注意,此转换在边界附近有损.您必须使用无限长度过滤器来完美地完成它.