Если вы едете на скорости, делайте это в частотной области.
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) );
}
Вам, конечно, нужно заполнить пробелы.