Поэтому я пытаюсь написать интерполятор частотной области, который обнуляет частотную характеристику сигнала и обратные преобразования. Есть два случая, с которыми мне приходится иметь дело:
- ответ - нужно разделить потому что она неоднозначна. Поэтому я копирую отрицательную часть спектра и добавляю нули между ними.
n*(interp-1)-1
- Ответ длины - поэтому просто разделите положительную / отрицательную частоту и вставьте между ними нули.
n*(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));
}
}
Первый случай работает нормально, я тестирую его по сигналу ЛЧМ, и он просто отлично интерполирует, есть небольшой числовой шум, но он округляется с помощью БПФ, так что вы можете сделать (первые или около того сигнал шоу):
Проблема в преобразовании нечетной длины, я получаю довольно отвратительный переходный ответ только на реальных выборках ( опять , реальные):
На воображаемом канале есть небольшая пульсация, но не такая плохая:
Как будто я свою в нечетном случае, но там нет , поэтому я очень озадачен. У кого-нибудь есть мысли?
источник
Ответы:
Обнуляя высокочастотные ячейки, вы эффективно умножили спектр сигнала с помощью прямоугольной функции. Умножение по частоте - это свертка во времени, а пара Фурье прямоугольника - это синк. Таким образом, вы действительно свернули сигнал временной области с каналом с шириной главного лепестка синуса, обратно пропорциональной длине прямоугольника. Вот почему многочисленные методы проектирования фильтров, такие как Parks-McClellan, проектируют в так называемой «зоне перехода» или «полосе перехода», чтобы не было мгновенного изменения частотной характеристики фильтра. Эти методы проектирования фильтров важны, потому что «идеальный» фильтр, который вы использовали, имеет такие нежелательные эффекты во временной области.
источник
Шаг в частотной области будет отображаться как пульсации во временной области. Если вы сглаживаете свои частотные данные с помощью оконной функции (например, окна Хэмминга), это должно значительно уменьшить пульсации.
источник