C wav文件整数样本的移位频率(使用FFT)

C wav文件整数样本的移位频率(使用FFT),c,audio,signal-processing,fft,wav,C,Audio,Signal Processing,Fft,Wav,我想对.wav文件进行频率转换 我的问题是FFT使用复数,而.wav文件有整数值。所以我想做一个频率偏移,这意味着我必须做一个直接变换和一个逆变换,问题是逆变换没有给我整数值(它给我复杂的数值),但我需要.wav文件样本的整数值 如何解释逆变换的值 我想对.wav文件进行频率转换 所以你有一个音频,这意味着一个实值信号 实值信号的频谱对f=0具有对称性,即其傅里叶变换具有厄米对称性 如果现在移动该输入光谱(蓝色),结果(红色)将失去对称性,即结果信号不再是真实信号: 请注意,通过别名,事物是如

我想对.wav文件进行频率转换

我的问题是FFT使用复数,而.wav文件有整数值。所以我想做一个频率偏移,这意味着我必须做一个直接变换和一个逆变换,问题是逆变换没有给我整数值(它给我复杂的数值),但我需要.wav文件样本的整数值

如何解释逆变换的值

我想对.wav文件进行频率转换

所以你有一个音频,这意味着一个实值信号

实值信号的频谱对f=0具有对称性,即其傅里叶变换具有厄米对称性

如果现在移动该输入光谱(蓝色),结果(红色)将失去对称性,即结果信号不再是真实信号:

请注意,通过别名,事物是如何循环的,因此您“移出”奈奎斯特范围的内容将显示在另一端。在我的示例中,这意味着您将获得意外的高频分量

我的问题是FFT使用复数,而.wav文件有整数值。所以我想做一个频率偏移,这意味着我必须做一个直接变换和一个逆变换,问题是逆变换没有给我整数值(它给我复杂的数值),但我需要.wav文件样本的整数值

真的!那是因为你转变的结果不再是真正的信号了

但是,您可以做的是:

  • 移位(无论是在时域还是频域——老实说,在时域进行移位会更容易!只需将第n个样本乘以exp(2jπf_移位/f_样本n)
  • 应用复带通滤波器,去除频率[0;f_采样/2-移位]之外的所有内容。这就给出了所谓的分析信号(即只有正频率),它仍然不是实值,因为它不是对称的
  • 现在扔掉虚部并不会改变信号的信息——它只是将能量减半,给你一个对称的频谱,你可以将它写入.wav文件
  • 现在,整个“通过FFT在频域中实现”是软件无线电世界的人们非常习惯的一种方法——他们一直在处理复杂的基带信号

    如何解释逆变换的值

    作为复杂的信号,他们是。忽略评论中建议的虚部会导致消极频率中包含的能量反射到积极频率上(反之亦然),这很可能不是你想要的——除非:

    • 你已经确定在“对称化”之前,f=0两边的能量是0,所以没有什么不好的事情发生,pr
    • 你已经确定你有选择地移动了负频率和正频率,这样对称性就保留了。注意,这不是整个频域的“简单”移位,而是两个选择性移位;这些移动区域的选择有一个形状,可以归结为使用一个窗口。如果你只是“选择”或“不选择”每个箱子进行移位,那么你实际上是在应用一个矩形窗口——你可能会因此产生吉布现象
    只要你在频域中保持共轭对称,那么逆变换将是纯实数,然后你可以将这些值缩放并取整为整数样本。正如Paul指出的那样。但是你的虚部可能包含一些非常小的数字。注意这一点,如果它们很小,可以安全地忽略它们。@PaulR但一个简单的移动永远无法保持这种对称性@马库斯穆勒:你只需要对称移动——下半部分的垃圾桶向上移动,而上半部分的垃圾桶向下移动。@PaulR:true;但根据我的定义,这不是一个“简单的转变”(我没有提到),所以请原谅我的过度评论!)。但是,是的,在我的答案的最后一段中,我没有正确地指出这一点,所以让我来解决这个问题。谢谢你的帮助!我忘了说我对这些东西很陌生。我的想法是,在时域中进行转换要容易得多。我不太明白你给我的公式。当你说“f_sample n”时,你指的是我进行直接傅里叶变换后得到的第n个值?对不起,我不知道。。。我在一本书中看到了与你所说的不同的东西:exp(j*shiftFrequency*k/N)*x[k]x[oldFrequency shiftFrequency]。其中x是时域中的样本,x是频域中的样本。N=样本总数