Действительный сигнал при заполнении нулями нечетной длины БПФ

13

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

  1. ответ - нужно разделить потому что она неоднозначна. Поэтому я копирую отрицательную часть спектра и добавляю нули между ними.Fs/2n*(interp-1)-1
  2. Ответ длины - поэтому просто разделите положительную / отрицательную частоту и вставьте между ними нули.Fs/2n*(interp-1)

Код, который выполняет заполнение нулями, можно увидеть здесь

// Copy negative frequency components to end of buffer and zero out middle
//  inp    - input buffer of complex floats
//    n    - transform size
//  interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
    if ((n % 2) == 0) {
        memmove(inp + n*interp - n/2, inp + n/2,     n/2*sizeof(cfloat_t));
        memset (inp + n/2 + 1, 0,       (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero

        inp[n/2]          /= 2.0;
        inp[n*interp-n/2] /= 2.0;
    } else {
        memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
        memset (inp + (n+1)/2, 0,         (n*(interp-1))*sizeof(cfloat_t));
    }
}

Первый случай работает нормально, я тестирую его по сигналу ЛЧМ, и он просто отлично интерполирует, есть небольшой числовой шум, но он округляется с помощью БПФ, так что вы можете сделать (первые или около того сигнал шоу):50μs

Проблема в преобразовании нечетной длины, я получаю довольно отвратительный переходный ответ только на реальных выборках ( опять , реальные):50μs

На воображаемом канале есть небольшая пульсация, но не такая плохая:

Как будто я свою в нечетном случае, но там нет , поэтому я очень озадачен. У кого-нибудь есть мысли?Fs/2Fs/2

GCT
источник
Ваши сюжеты немного трудно увидеть, так как они были сокращены.
Джейсон Р
@ Джейсон, извини, я думал, что они связаны, я настроил HTML, чтобы они теперь могли кликнуть на полный размер.
GCT
3
У вас есть код или файл примера для того, что вы используете в качестве входных данных? Следует иметь в виду, что граничные условия предполагаются ДПФ. В частности, существует внутреннее предположение, что интересующий сигнал является периодическим. Итак, если есть разрыв между первым и последним сэмплами на входе нечетной длины, то вы можете видеть звуки, как вы наблюдали. Вполне возможно, что выборка четной длины более непрерывна от начала до конца, поэтому вы не видите этого явления.
Джейсон Р
У меня нет данных в формате, который кто-либо другой мог бы легко переварить, но я думаю, что вы правы. Я только что пришел сюда, чтобы работать и перекомпилировал мой код / ​​сгенерировал тестовый вход (10 Гц-100 Гц чирикант в течение 1 секунды), перезапустил код и не получил звонка. Я увидел ваш комментарий и изменил частоту на 10-100.314, и теперь вижу звонки как на четных, так и на нечетных преобразованиях.
GCT
1
Вы пытались применить оконную функцию к вашим данным? Это обычно уменьшает звон.
MarkSci

Ответы:

1

Обнуляя высокочастотные ячейки, вы эффективно умножили спектр сигнала с помощью прямоугольной функции. Умножение по частоте - это свертка во времени, а пара Фурье прямоугольника - это синк. Таким образом, вы действительно свернули сигнал временной области с каналом с шириной главного лепестка синуса, обратно пропорциональной длине прямоугольника. Вот почему многочисленные методы проектирования фильтров, такие как Parks-McClellan, проектируют в так называемой «зоне перехода» или «полосе перехода», чтобы не было мгновенного изменения частотной характеристики фильтра. Эти методы проектирования фильтров важны, потому что «идеальный» фильтр, который вы использовали, имеет такие нежелательные эффекты во временной области.

user27575
источник
0

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

Цзянь
источник