Сдвиг частоты без промежуточного буфера с использованием IPP - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть буфер, полный реальных / мнимых значений выборки сигнала, и я хотел бы сместить сигнал в частотной области путем умножения синусоиды.

Я вижу себя с четырьмя вариантами:

  • некоторая функция IPP (хотя я не смог ее найти)
  • вычисление результата вручную (вероятно, медленнее, чем IPP)
  • генерация синусоиды в отдельном буфере (вероятно, требует многопамяти)
  • генерирует части синусоиды в отдельном буфере (требует пересчета тонового буфера)

Мне интересно, какой подход будет лучшим здесь, и / илиЯ только что пропустил, что есть готовая функция для сдвига частоты сложного сигнала.

1 Ответ

0 голосов
/ 15 сентября 2012

Если вы едете на скорости, делайте это в частотной области.

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) );
}

Вам, конечно, нужно заполнить пробелы.

...