如何对采样的音频信号进行频谱反转

问题描述:

我正在寻找一个简单的(伪)代码,对采样的音频信号进行频谱反转。 理想的C++如何对采样的音频信号进行频谱反转

该代码应支持不同的采样率(16/32/48KHz)。

+1

什么是“频谱反转”?有趣的是,谷歌在这里首先揭示了你的问题。 你想要每个频率的相位和振幅的倒数?或者你只是想要一个IFFT?或者完全不同的东西? – zerm 2010-08-19 10:22:00

+0

对不起我的不专业的词汇:我想要低频成为高频,反之亦然(直流偏移将成为一半采样频率的正弦)。 – 2010-08-19 10:30:45

+1

现在我很好奇听到这听起来像什么...... – PeterAllenWebb 2010-08-19 16:38:07

将信号混合Fs/2将交换高频率和低频率 - 考虑将单位圆周围的频谱旋转半圈。您可以通过将每个其他样本乘以-1来实现此旋转。

通过Fs/2混合相当于通过exp(j*pi*n)混合。如果x是输入和y输出,

y[n] = x[n] * exp(j*pi*n) = x[n] * [cos(pi*n) + j*sin(pi*n)] 

这容易简化因为sin(pi*n)是0,并且cos(pi*n)是交替1,-1。

+0

这么简单...令人难以置信 – 2010-09-08 10:31:04

+2

这个技巧在DSP中出现了很多。例如,如果您要设计高通滤波器,通常设计一个具有所需截止比例的低通滤波器比较容易,然后围绕单位圆旋转它以使其达到高通。 – mtrw 2010-09-08 12:47:39

为了得到的东西,具有相同类型的时间结构与原来,你需要

  • 创建频谱(有一些窗口大小)
  • 挑选了一些上下频率界限,使你会翻转
  • 翻转频谱图的强度的范围内
  • 再合成与频率一致的声音信号

由于这是一个音频信号,因此相位都会混乱起来并不重要。无论如何,你一般都听不到它们。除了翻转部分,ARSS做谱图创建和声音再合成。否则,您可以采取FFT,反转组件的幅度,并进行逆FFT。但这基本上是荒谬的,因为它会完全扰乱声音的时间结构以及频率结构。

+0

谢谢ARSS使用频率滤波器组,所以我所能做的只是反转频率分档。我想知道是否有一些数学处理能够“平滑地”反转频率(没有将频率划分为分箱)。 – 2010-08-20 17:46:33

+0

您可以使用未明确归档的小波,但在您​​的情况下几乎不重要。低频声音变化比高频声音慢得多,所以翻转会改变光滑度。 – 2010-08-20 17:58:42

使用余弦没有多大意义。对于数字信号来说,在这里运行一个真正的ringmod并不是必需的,在nyquist的情况下反正是正方形。

所以你只需乘以* -1乘以所有其他样本,就完成了。

没有延迟,没有别名,没有任何东西。

+0

这就是接受的答案所说的。 – 2016-08-23 03:27:52