Дійсний дзвінок у реальному значенні, коли FFT з невідкладною довжиною прокладки непарної довжини


13

Тож я намагаюся написати інтерполятор частотної області, який відповідає нульовій частоті частотного сигналу сигналу та оберненого перетворення. Я маю справу з двома випадками:

  1. Відповідь рівномірної довжини - доведеться розділити кошик оскільки це неоднозначно. Тому я копіюю негативну частину спектру і додаю нулі між ними.Fs/2n*(interp-1)-1
  2. Відповідь непарної довжини - немає bin, тому просто розділіть позитивну / негативну частоту і вставіть нулі між ними.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


Ваші сюжети трохи важко помітити, оскільки вони скоротилися.
Джейсон R

@Jason вибачте, що я подумав, що вони пов'язані, я переробив html, щоб вони могли натискати на повний розмір зараз.
gct

3
Чи є у вас код або приклад файлу для того, що ви використовуєте в якості вхідних даних? Слід пам’ятати, що граничні умови, прийняті DFT. Зокрема, існує властиве припущення, що сигнал, що цікавить, є періодичним. Отже, якщо між першим та останнім зразками на вході непарної довжини спостерігається розрив, то ви можете бачити дзвінки, як те, що ви спостерігали. Можливо, що зразок парної довжини є більш безперервним від початку до кінця, тому цього явища ви не бачите.
Джейсон R

У мене немає даних у форматі, хто б хто-небудь інший не міг легко перетравити, але я думаю, що ви праві. Я щойно приїхав сюди на роботу і перекомпілював свій код / ​​відновив тестовий вхід (10 Гц-100 Гц щебетати за 1 секунду) і повторно запустив код і не отримав дзвінок. Я побачив ваш коментар і змінив частоту на 10-100.314, і зараз я бачу дзвінки на парних і непарних перетвореннях.
gct

1
Ви спробували застосувати функцію вікна до своїх даних? Це, як правило, зменшить дзвінок.
MarkSci

Відповіді:


1

Онулювавши високі частоти, ви ефективно помножили спектр сигналу на прямокутну функцію. Множення за частотою - це згортання у часі, і пара Фур'є прямої є синк. Отже, що ви насправді зробили, це перекрутити сигнал часової області синхронізом з шириною основної долі синк, обернено пропорційною довжині прямої кишки. Ось чому численні методи проектування фільтру, як Паркс-МакКлеллан, проектують у тому, що називається "перехідною областю" або "перехідною" смугою, щоб не відбулося миттєвої зміни частотної характеристики фільтра. Ці методи проектування фільтрів є важливими, оскільки "ідеальний" фільтр, як ви використовували, має такі небажані ефекти у часовій області.


0

Крок у частотній області відображатиметься як пульсації у часовій області. Якщо ви згладжуєте свої частотні дані за допомогою функції вікна (наприклад, вікно Хеммінга), це має значно зменшити пульсації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.