如何将基带采样信号从实值样本转换为复值样本(实的、虚的),反之亦然。
我的样本是整数,我正在寻找一种快速(但准确)的转换算法。
C++示例代码(真实的,不复杂的;-)将非常受欢迎。
编辑:IPP代码将非常受欢迎。
编辑:,我正在寻找一种将n个实样本转换为n/2复样本的方法,反之亦然,而不影响带宽。
发布于 2010-09-24 06:19:05
在你想要做的事情的第一步,从概念上来说,把零添加到想象中是第一步。最初,您有一个在频域中看起来像这样的真正的唯一信号:
[r0, r1, r2, r3, ...]
/-~--------\
DC +Fs/2如果你用零填充虚值,你会发现你真的有正负两种频率作为镜像:
[r0 + 0i, r1 + 0i, r2 + 0i, r3 + 0i, ...]
/--------~-\ /-~--------\
-Fs/2 DC +Fs/2接下来,将时域中的信号乘以复声调为-Fs/4 (调谐信号)。你的信号看起来就像
----~-\ /-~--------\ /------
DC所以现在,你过滤掉中间的一半,然后你得到:
________/-~--------\________
DC然后你被消灭了两个,最后你得到了:
/-~--------\这就是你想要的。
所有这些步骤都可以在时域内有效地执行。如果您注意到所有中间步骤,您会注意到在许多地方,您正在将0、+1、-1、+i或-i相乘。此外,半带低通滤波器将有大量的零和一些对称性的利用。因为你知道你会被2毁灭,所以你只需要计算你想要保存的样本。如果你在代数中工作,你会发现很多地方可以简化它,以实现一个干净而快速的实现。
最终,这一切都等同于希尔伯特变换,但我认为,当你把它分解成这样的碎片时,更容易理解。
从复杂的转换回真实是类似的。你会用零填充每一个其他样本,以撤销抽取。您将过滤复杂的信号以删除您刚才介绍的别名。你会用Fs/4来调整它,然后扔掉想象中的成分。(对不起,我都累坏了.:-)
请注意,此转换在边界附近是有损的。你必须使用一个无限长的过滤器来完美地完成它。
发布于 2010-09-23 18:31:21
如果您想要创建一个具有严格实谱的复向量,只需在每个样本中添加一个0的虚分量即可。根据数据格式的不同,这可能与创建双长度内存数组、对其进行归零以及从源的每个元素复制到目标的每个其他元素一样简单。
如果要将包含复杂数据(在所需最小噪声地板上的非零假想分量)的复杂矢量转换为实际矢量,则需要将带宽加倍,以避免丢失信息,除非您正在调制、解调或滤波信号,否则这可能是有意义的,也可能没有意义。
如果你想从一个实向量产生一个具有复谱的单边信号,你可以使用希尔伯特变换(或滤波器)来创建一个具有相同频谱但共轭相位(除直流外)的虚分量。这可能既不快又不准确。
发布于 2013-07-22 10:54:56
我不确定这是否是你想要的,但你可能想要检查希尔伯特变换,它可以用来找到实值信号的分析性表示,也就是一个信息量相同但没有负频率成分的信号。
这种表示在使用频谱移位(如单边带调制 )的数字信号处理技术中非常有用,这是一种有效的幅度调制( AM )形式,占用了原始AM带宽的一半。
https://stackoverflow.com/questions/3780921
复制相似问题