Как циклически сдвинуть сигнал на долю выборки?

22

Теорема о сдвиге гласит :

Умножение на линейную фазу для некоторого целого числа m соответствует круговому сдвигу выхода : заменяется на , где нижний индекс интерпретируется по модулю N (то есть периодически).ИксN е2πяNNмИксКИксКИксК-м

Хорошо, это прекрасно работает:

plot a

произвольный сигнал с 9 выборками

N = 9
k = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot ifft(fft(a)*exp(-1j*2*pi*3*k/N))

сигнал сдвинут на 3 выборки в частотной области

Он сдвинут на 3 сэмпла, как я и ожидал.

Я думал, что вы могли бы также сделать это, чтобы смещаться на доли выборки, но когда я пытаюсь это сделать, мой сигнал становится мнимым, а не похожим на оригинал:

plot real(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N)))
plot imag(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N))), 'b--'

сигнал после умножения на 3,5 комплексной экспоненты

Я не ожидал этого вообще. Разве это не эквивалентно свертыванию с реальным импульсом, сдвинутым на 3,5 сэмпла? Значит, импульс должен быть реальным, а результат - реальным? И он должен иметь более или менее ту же форму, что и оригинал, но sinc интерполированы?

эндолиты
источник
Вот представление Matlab File Exchange, которое вычисляет правильную модуляцию для четных / нечетных длинных реальных / комплексных сигналов и дробных задержек их: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ахмед Фасих,

Ответы:

14

Если вы хотите, чтобы смещенный выходной сигнал IFFT был реальным, поворот / поворот фазы в частотной области должен быть сопряженным симметричным, как и данные. Это может быть достигнуто путем добавления соответствующего смещения к показателю вашего комплексного exp () для данного фазового наклона, так что фаза верхней (или отрицательной) половины, по модулю 2 Pi, отражает нижнюю половину в апертуре БПФ , Комплексная экспоненциальная функция сдвига также может быть сделана сопряженной симметричной путем индексации ее от -N / 2 до N / 2 с нулевой фазой при индексе 0.

Так уж сложилось, что соответствующее смещение для фазовых скручиваний или спиралей, которые завершают точное целое число, кратное поворотам 2 Pi в апертуре, чтобы быть сопряженным симметричным по апертуре, равно нулю.

С сопряженным симметричным вектором фазового скручивания результат должен затем закончиться как круговая интерполяция Синка для нецелых сдвигов.

Разработка ОП:

Ваш выбор k = [0, 1, 2, 3, 4, 5, 6, 7, 8] дает экспоненциальную комплексную асимметричность:

попытка асимметричного комплексного экспоненциального сдвига выборки 0,5 с мнимой частью в виде пунктирной линии

Если вместо этого вы используете k = [0, 1, 2, 3, 4, -4, -3, -2, -1], вы получите эрмит-симметрическую комплексную экспоненту:

plot(fftshift(exp(-1j * 2*pi * 0.5/N * k)))

Эрмит-симметричная комплексная экспонента для сдвига выборки 0,5 с мнимой частью в виде пунктирной линии

и теперь, когда вы используете одну и ту же экспоненциальную формулу для сдвига на 0,5 или 3,5 выборки, вы получите реальный результат:

plot ifft(fft(a)*exp(-1j * 2 * pi * 0.5/N *k))
plot ifft(fft(a)*exp(-1j * 2 * pi * 3.5/N *k))

сдвиг на 0,5 и 3,5 сэмпла с оригинальной пунктирной линией

hotpaw2
источник
Ага! Вместо того k = [0, 1, 2, 3, 4], я должен использоватьk = [0, 1, 2, -2, -1]
эндолиты
@endolith / hotpaw2, Другими словами, все дело в индексации образцов во временной области?
TheGrapeBeyond
1
Симметрия вокруг bin 0 также обеспечит симметрию вокруг N / 2, даже если N / 2 не является целым числом.
hotpaw2
1
Я нашел функцию, которая применяет правильную модуляцию в Matlab File Exchange: mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
Ахмед Фасих
1
одинаково ли это для сложных сигналов?
Лев