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

Algorithm DSP-将采样信号从实采样转换为复采样,反之亦然,algorithm,signal-processing,Algorithm,Signal Processing,如何将基带采样信号从实数采样转换为复数采样(实数、虚数),反之亦然 我的样本是整数,我正在寻找一种快速(但准确)的转换算法 一个C++示例代码(实数,不复杂;-----)将不受欢迎。 编辑:欢迎使用IPP代码 编辑:我正在寻找一种方法,可以将n个实样本转换为n/2个复样本,反之亦然,而不影响带宽。如果您想创建一个具有严格实频谱的复向量,只需在每个样本中添加一个0.0的虚部分即可。根据您的数据格式,这可能与创建双倍长度的内存数组、将其归零以及从源的每个元素复制到目标的每个其他元素一样简单 如果要将

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

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

一个C++示例代码(实数,不复杂;-----)将不受欢迎。

编辑:欢迎使用IPP代码


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

如果您想创建一个具有严格实频谱的复向量,只需在每个样本中添加一个0.0的虚部分即可。根据您的数据格式,这可能与创建双倍长度的内存数组、将其归零以及从源的每个元素复制到目标的每个其他元素一样简单

如果要将包含复数数据的复数向量(高于所需最小噪声下限的非零虚分量)转换为实向量,则需要将带宽增加一倍,以避免丢失可能有意义或可能没有意义的信息,除非您正在调制、解调或过滤信号


如果要从实向量生成具有复频谱的单边信号,可以使用希尔伯特变换(或滤波器)创建具有相同频谱但共轭相位的虚部(DC除外)。这可能既不快速又不准确。

在概念上,将零添加为假想数是您想要做的第一步。最初,只有一个真实的信号在频域中是这样的:

           [r0, r1, r2, r3, ...]

                           /-~--------\
                         DC            +Fs/2
如果你用零填充它的虚值,你会发现你真的有正反两个频率作为镜像:

           [r0 + 0i, r1 + 0i, r2 + 0i, r3 + 0i, ...]

             /--------~-\  /-~--------\
          -Fs/2          DC            +Fs/2
接下来,将时域中的信号乘以-Fs/4处的复音调(调整信号)。你的信号看起来像

           ----~-\ /-~--------\ /------
                        DC
现在,你过滤掉中半部,得到:

           ________/-~--------\________
                        DC
然后你以2比2的大比分杀戮,结果是:

                   /-~--------\
这就是你想要的

所有这些步骤都可以在时域中有效地执行。如果你注意到所有的中间步骤,你会注意到有很多地方你在乘以0、+1、-1、+i或-i。此外,半带低通滤波器将有许多零点和一些对称性可利用。因为你知道你将要以2的速度毁灭,你只需要计算你打算保留的样本。如果你学习代数,你会发现很多地方可以简化它,从而得到一个干净、快速的实现

最终,这一切都相当于希尔伯特变换,但我认为当你把它分解成这样的片段时,更容易理解

从复数转换回实数是类似的。您将为每一个其他样本填充零,以撤消抽取。您将对复杂信号进行过滤,以删除刚才引入的别名。您将按Fs/4对其进行调整,然后丢弃虚构的组件。(对不起,我已经筋疲力尽了…:-)


请注意,此转换在边界附近是有损的。你必须使用一个无限长的滤波器才能做到完美。

我不确定这是否是你要寻找的,但你可能想检查,它可以用来找到实值信号的表示,即具有相同信息量但没有负频率分量的信号


这种表示法在采用频谱移位的数字信号处理技术中最为有用,例如,一种有效的调幅形式(AM),它使用原始AM使用的带宽的一半。

我还没有足够的分数来投票给zml,但他的答案显然是正确的。希尔伯特变换本质上是将实值信号转换为更自然的域,其中声音的成分是复杂的“相量”,而不是正弦波。它基本上是通过斩波傅里叶光谱的一半来实现的,这涉及到“螺旋度”的单一选择(即cw与ccw),但允许您通过乘以一个相量来实现完美的节距偏移。这种可能性是无限的,我希望这种复杂的音频表现能流行起来

Intel Performance Primitives(IPP)有一个函数正好可以做到这一点

根据他们的文件:

Shilbert函数计算复杂的分析信号, 它包含原始实信号作为其实部,并且 计算希尔伯特变换作为其虚部


我认为这个问题没有任何意义,除非您描述了要进行的转换的语义。您可以将示例视为复数,隐式虚部为0。但你可能想应用某种变换——在这种情况下,你需要说明它是什么。对于DSP算法(如滤波、频移等)——许多实现是为复杂样本设计的,而其他实现是为真实样本设计的。由于复表示只需要相同数据的实表示所需样本数的一半,因此仅将虚部设置为0不是解决方案。通常,当信号处理链中的某个位置存在混频器时,会出现复时域样本。如果只有一个同相分量和正交分量,通常无法恢复另一个分量。为什么不足以频移Fs/4,然后进行滤波?为什么加上零虚部和小数有用?@tashuhka,这是我的解释:1。当你把零加到虚部时,你基本上把你的信号看成是复信号。通过这样做,您将继续获得相同的信息,但现在已拥有复杂空间中允许的工具。2.关于抽取,您正在丢弃不需要的信息来表示