我一直在尝试一些我可以找到的频率转换技术(特别是我想将高频信号转换为较低的频率)。目前我正在尝试使用这种技术 -
取原始信号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是要移位的delta频率。 现在你有两个时间序列信号: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的数组值以获得频率转换,但无济于事。有没有更好的方法来做到这一点?
答案 0 :(得分:1)
如果您希望频移听起来更“自然”,则必须保持所有初始频率区间的比率,其中移位量将取决于FFT区间,因此需要大量插值。相位声码器算法将使用多个FFT来减少结果中的相位失真。
答案 1 :(得分:1)
为每个框架数据使用汉宁窗口
一旦有了窗口的音频数据帧,就可以对其进行FFT
在频域进行某种转换(你可以使用 Flanagan - 阶段声码器
现在您需要使用IFFT
在IFFT数据中应用汉宁窗口
在每个新的时域数据帧中使用overlap-add到输出中 流
我的结果:
我创建了两个串联的正弦曲线(250Hz和400Hz)并向上移动了一个八度音阶!
蓝色波形是原始的,红色被更改,你可以看到一个由重叠添加和hann窗口引起的fadeIN-fadeOut!