Поэтому я пытаюсь написать интерполятор частотной области, который обнуляет частотную характеристику сигнала и обратные преобразования. Есть два случая, с которыми мне приходится иметь дело:
- ответ - нужно разделить потому что она неоднозначна. Поэтому я копирую отрицательную часть спектра и добавляю нули между ними.
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));
}
}
Первый случай работает нормально, я тестирую его по сигналу ЛЧМ, и он просто отлично интерполирует, есть небольшой числовой шум, но он округляется с помощью БПФ, так что вы можете сделать (первые или около того сигнал шоу):
Проблема в преобразовании нечетной длины, я получаю довольно отвратительный переходный ответ только на реальных выборках ( опять , реальные):
На воображаемом канале есть небольшая пульсация, но не такая плохая:
Как будто я свою в нечетном случае, но там нет , поэтому я очень озадачен. У кого-нибудь есть мысли?