1

我一直在尝试一些不同的技术,我可以找到用于频率转换的方法(特别是我想将高频信号转换为较低的频率)。目前我正在尝试使用这种技术 -

将原始信号 x(t) 乘以: cos(2 PI dF t), sin(2 PI dF t) R(t) = x(t) cos(2 PI dF t) I(t) = x(t) sin(2 PI dF t) 其中 dF 是要偏移的增量频率。现在您有两个时间序列信号:R(t) 和 I(t)。使用 R(t) 作为实部,I(t) 作为虚部,进行复傅立叶变换。结果将是频移频谱。

我已将其解释为以下代码 -

for(j=0;j<(BUFFERSIZE/2);j++)
{
Partfunc = (((double)j)/2048);

PreFFTShift[j+x] = PingData[j]*(cos(2*M_PI*Shift*(Partfunc)));
PreFFTShift[j+1+x] = PingData[j]*(sin(2*M_PI*Shift*(Partfunc)));
x++;
}

//INITIALIZE FFT
status = arm_cfft_radix4_init_f32(&S, fftSize, ifftFlag, doBitReverse); 

//FFT on FFTData
arm_cfft_radix4_f32(&S, PreFFTShift); 

这为我构建了一个包含交错实数和图像数据的数组,然后是 FFT。然后我反转 FFT,但我得到的输出非常乱码。与我认为的结果相比,结果似乎很大,虽然有一些频移信号的痕迹,但很难说,因为结果似乎大部分都很嘈杂。

我还尝试简单地旋转原始信号的标准 FFT 的数组值以获得频移,但无济于事。有没有更好的方法来做到这一点?

4

2 回答 2

2

你有没有尝试过类似的东西:

  • 对每个框架数据使用汉宁窗

  • 一旦有了音频数据的窗口帧,就可以对其进行 FFT

  • 在频域中进行某种变换(可以使用 Flanagan - 相位声码器)

  • 现在您需要使用 IFFT 回到时域

  • 在 IFFT 数据中应用汉宁窗

  • 在每个新的时域数据帧中使用重叠添加到输出流中

我的结果:

我创建了两个连接的正弦曲线(250Hz 和 400Hz)并向上移动一个八度!

在此处输入图像描述

蓝色波形是原来的,红色被改变了,你可以看到一个fadeIN-fadeOut由overlapping add和hann window引起的!

于 2013-08-12T16:54:50.707 回答
1

如果您希望频移听起来更“自然”,则必须保持所有初始频率区间之间的比率,其中偏移量将取决于 FFT 区间,因此需要大量插值。相位声码器算法将使用多个 FFT 来减少结果中的相位失真。

于 2013-08-12T15:39:02.670 回答