DSP - преобразование дискретизированного сигнала из реальных выборок в сложные выборки и наоборот - PullRequest
2 голосов
/ 23 сентября 2010

Как преобразовать сигнал в основной полосе частот из реальных значений в комплексные (реальные, мнимые) и наоборот.

Мои выборки целые, и я ищу быстрые (но точные) алгоритмы преобразования.

Пример кода на C ++ (реальный, не сложный ;-) будет более чем приветствоваться.

Редактировать : код IPP будет приветствоваться.

Редактировать: Я ищу метод, который преобразует n реальных выборок в n / 2 комплексных выборок и наоборот, без влияет на пропускную способность.

Ответы [ 4 ]

9 голосов
/ 24 сентября 2010

Добавление нулей как мнимых является концептуально первым шагом в том, что вы хотите сделать. Изначально у вас есть реальный единственный сигнал, который выглядит в частотной области следующим образом:

           [r0, r1, r2, r3, ...]

                           /-~--------\
                         DC            +Fs/2

Если вы введете его в нули для мнимого значения, вы увидите, что у вас действительно есть как положительные, так и отрицательные частоты в качестве зеркальных изображений:

           [r0 + 0i, r1 + 0i, r2 + 0i, r3 + 0i, ...]

             /--------~-\  /-~--------\
          -Fs/2          DC            +Fs/2

Затем вы умножаете этот сигнал во временной области на сложный тон в -Fs / 4 (настройка сигнала). Ваш сигнал будет выглядеть как

           ----~-\ /-~--------\ /------
                        DC

Итак, теперь вы отфильтровываете центральную половину и получаете:

           ________/-~--------\________
                        DC

Затем вы уничтожаете на два и в итоге получаете:

                   /-~--------\

Что ты и хочешь.

Все эти шаги могут быть эффективно выполнены во временной области. Если вы обратите внимание на все промежуточные шаги, вы заметите, что есть много мест, где вы умножаете на 0, +1, -1, + i или -i. Кроме того, полуполосный фильтр нижних частот будет иметь много нулей и некоторую симметрию для использования. Поскольку вы знаете, что вы хотите уменьшить число на 2, вам нужно только рассчитать образцы, которые вы намереваетесь сохранить. Если вы работаете с алгеброй, вы найдете много мест, где ее можно упростить для простой и быстрой реализации.

В конечном счете, все это эквивалентно преобразованию Гильберта, но я думаю, что гораздо легче понять, когда вы разложите его на такие части, как этот.

Преобразование обратно в реальное из сложного аналогично. Вы будете заполнять его нулями для каждого другого образца, чтобы отменить децимацию. Вы отфильтруете сложный сигнал, чтобы удалить только что введенный псевдоним. Вы настроите его с помощью Fs / 4, а затем выбросите мнимый компонент. (Извините, я весь ascii-arted вне ...: -)

Обратите внимание, что это преобразование с потерями вблизи границ. Вы должны использовать фильтр бесконечной длины, чтобы сделать это идеально.

2 голосов
/ 23 сентября 2010

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

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

Если вы хотите получить односторонний сигнал со сложным спектром из реального вектора, вы можете использовать преобразование (или фильтр) Гильберта для создания мнимого компонента с тем же спектром, но сопряженной фазой (за исключением DC). Вероятно, это будет не так быстро и точно.

1 голос
/ 01 октября 2014

У меня недостаточно очков, чтобы проголосовать за zml, но его ответ, безусловно, правильный.Преобразование Гильберта по существу преобразует ваш реальный сигнал в его более естественную область, где компоненты звука являются сложными «векторами», а не синусоидальными волнами.Он делает это, по существу, прерывая половину спектра Фурье, который включает в себя один выбор «спиральности» (т.е. cw против ccw), но позволяет вам делать такие вещи, как идеальное смещение высоты тона, умножая на один вектор.Возможности бесконечны, и я надеюсь, что это сложное представление аудио будет популярным!

1 голос
/ 22 июля 2013

Я не уверен, что это то, что вы ищете, но вы можете проверить преобразование Гильберта , которое можно использовать для поиска аналитического реального представления -значные сигналы, т. е. сигнал с таким же количеством информации, но без отрицательных частотных составляющих.

Такое представление в основном полезно в методах цифровой обработки сигналов, использующих спектральное смещение, такое как Однополосная модуляция , эффективная форма амплитудной модуляции (AM), которая использует половину полосы пропускания, используемой необработанным AM.

...