我有一个充满信号实/虚样本值的缓冲区,并且想通过乘以正弦曲线来在频域中移动信号。
我认为自己有四个选择:
- 一些 IPP 功能(虽然我找不到)
- 手动计算结果(可能比 IPP 慢)
- 在单独的缓冲区中生成正弦曲线(可能需要大量内存)
- 在单独的缓冲区中生成部分正弦曲线(需要重新计算音调缓冲区)
我想知道这里最好的方法是什么,和/或我是否刚刚错过了用于频移复杂信号的现成功能。
我有一个充满信号实/虚样本值的缓冲区,并且想通过乘以正弦曲线来在频域中移动信号。
我认为自己有四个选择:
我想知道这里最好的方法是什么,和/或我是否刚刚错过了用于频移复杂信号的现成功能。
如果您追求速度,请在频域中进行。
FFT -> circular shift by N bins -> IFFT
我发现 ffw++ 包装器非常方便。
如果您真的打算在时域中执行此操作,则可以以如下方式使用 Intel 的 VML 函数:
// Create a single period of frequency offset wave
vector<complex<float> > cxWave(period);
for(int i = 0; i < period; ++i)
cxWave = i * 2 * M_PI / period;
vcExp( period, &cxWave.at(0), &cxWave.at(0) );
// Multiply entire signal by the complex sinusoid
for(int frame=0; frame < numFrames; ++frame)
{
vcMul( period, &input.at(frame*period), &cxWave.at(0), &cxWave.at(0) );
}
您当然需要填写空白。