Тот факт, что результат является сложным, следует ожидать. Я хочу указать на пару вещей:
Вы применяете к данным фильтр в частотной области с кирпичной стенкой, пытаясь обнулить все выходы БПФ, которые соответствуют частоте, превышающей 0,005 Гц, и затем выполнить обратное преобразование, чтобы снова получить сигнал во временной области. Чтобы результат был действительным, входной сигнал для обратного БПФ должен быть сопряженно-симметричным . Это означает, что для длины БПФ,N
Икс[ k ] = X*[ N- k ] , k = 1 , 2 , … , N2- 1( Ne v e n )
Икс[ k ] = X*[ N- k ] , k = 1 , 2 , … , ⌊ N2⌋( Nо дd)
- Обратите внимание, что для четного и в общем случае не равны, но оба они действительны. Для нечетных , должен быть реальным.NИкс[ 0 ]NX[0]Икс[ N2]NИкс[ 0 ]
Я вижу, что вы пытались сделать что-то подобное в своем коде выше, но это не совсем правильно. Если вы применяете вышеуказанное условие к сигналу, который вы передаете обратному БПФ, вы должны получить реальный сигнал.
Мое второе замечание носит скорее философский характер: то, что вы делаете, будет работать, поскольку оно будет подавлять контент в частотной области, который вам не нужен. Однако обычно это не тот способ, которым фильтр нижних частот будет реализован на практике. Как я уже упоминал ранее, вы, по сути, применяете фильтр, который имеет отклик в виде кирпичной стены (то есть идеально прямоугольной). Импульсная характеристика такого фильтра имеет форму . Поскольку умножение в частотной области эквивалентно (в случае использования DFT, круговой) свертки во временной области, эта операция эквивалентна свертке сигнала временной области с функцией .s i n csinc(x)sinc
Почему это проблема? Вспомним, как выглядит функция во временной области (ниже изображение бесстыдно позаимствовано из Википедии):sinc
Функция имеет очень широкую поддержку во временной области; он затухает очень медленно, когда вы отодвигаетесь во времени от своей основной доли. Для многих приложений это нежелательное свойство; когда вы свертываете сигнал с , эффекты медленно затухающих боковых лепестков часто будут проявляться в форме отфильтрованного выходного сигнала во временной области. Этот вид эффекта часто называют звонком . Если вы знаете, что делаете, в некоторых случаях этот тип фильтрации может быть уместным, но в общем случае это не то, что вам нужно.с я н сsincsinc
Существуют более практичные способы применения фильтров низких частот как во временной, так и в частотной областях. Фильтры с конечной импульсной характеристикой и бесконечной импульсной характеристикой могут быть применены напрямую, используя их представление разностного уравнения . Или, если ваш фильтр имеет достаточно длинный импульсный отклик, вы часто можете получить выигрыш в производительности, используя методы быстрой свертки , основанные на БПФ (применение фильтра путем умножения в частотной области вместо свертки во временной области), например перекрытие методы сохранения и перекрытия-добавления .