Является ли численно более устойчивым применение фильтрации как умножения или свертки?


12

Я пишу программу для фильтрации сигнала 20000 с автономным фильтром Баттерворта пятого порядка. У меня есть доступ к реализации FFT. Кажется, есть две альтернативы для реализации фильтрации:

  • свертывание сигнала с импульсным откликом во временной области, или
  • умножение сигнала на импульсную характеристику в частотной области и обратное преобразование результата

Эти методы были бы идентичны в теоретическом случае FT. Делая это в реальной жизни с DFT, я полагаю, что все по-другому. Является ли один из методов численно более стабильным? Есть ли другие проблемы, о которых я должен знать? Количество расчетов не важно.


Метод БПФ будет гораздо быстрее вычислять для большинства длин сигналов. Только короткие длины быстрее со сверткой во временной области.
эндолит

Ответы:


5

При свертке вы не столкнетесь с какими-либо проблемами стабильности, потому что нет рекурсивной фильтрации, поэтому вы не будете накапливать ошибки. Другими словами, система - все нули, нет полюсов. Я слышал анекдотично, но не проверял для себя, что свертка на основе БПФ имеет меньшую погрешность, чем свертка во временной области, просто потому, что она имеет O (n log n) арифметических операций, а не O (n ^ 2).

Обычно, насколько мне известно, фильтры Баттерворта реализованы как рекурсивные (БИХ) фильтры, так что это отдельная тема. Фильтры БИХ имеют как полюсы, так и нули, поэтому на практике могут возникнуть проблемы со стабильностью. Кроме того, для БИХ-фильтров методы на основе БПФ не являются опцией, но с другой стороны, БИХ-фильтры имеют тенденцию быть очень низкого порядка.

Что касается проблем стабильности с фильтрами БИХ, у них, как правило, возникают проблемы при более высоких порядках - я просто выброшу число и скажу, что примерно 6-й порядок толкает его. Вместо этого они обычно реализуются в виде каскадных биквад (секции фильтра 2-го порядка). Для вашего фильтра 5-го порядка запишите его как передаточную функцию z-домена (это будет рациональная функция 5-й степени), а затем разложите его на 5 полюсов и 5 нулей. Соберите комплексные конъюгаты, и у вас будет два биквада и один фильтр первого порядка. В общем, проблемы со стабильностью, как правило, возникают, когда полюса приближаются к окружности.

Также могут быть проблемы с шумом и предельными циклами в фильтрах БИХ, поэтому существуют разные топологии фильтров (то есть прямая форма I, прямая форма II), которые имеют разные числовые свойства, но я бы не стал задумываться над этим - просто используйте двойную точность, и это почти наверняка будет достаточно хорошо.


Что вы имеете в виду, когда он работает только для FIR-фильтров? Я предполагал, что в любом случае фильтры БИХ-анализа должны быть как-то опробованы. Применяются ли обычно фильтры IIR во временной области, чтобы избежать этого?
Андреас

1
Насколько мне известно, БИХ-фильтры всегда реализуются во временной области. БИХ-фильтр (здесь, например, фильтр второго порядка или «биквад») определяется как разностное уравнение, подобное y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2). Обратите внимание, что это комбинация предыдущих входных выборок (значения x) и предыдущих выходных выборок (значения y). КИХ-фильтр зависит только от прошлых входных данных, поэтому он допускает эффективную реализацию в частотной области. БИХ-фильтр - нет, но в любом случае он очень эффективен, потому что БИХ-фильтры имеют тенденцию быть гораздо более низкого порядка.
Шнарф

1
Причина, по которой IIR-фильтры имеют тенденцию быть намного более низкого порядка, состоит в том, что полюсы (обратная связь предыдущих выходных выборок) позволяет фильтру становиться намного более крутым с очень малыми коэффициентами по сравнению с КИХ-фильтром. Когда я говорю гораздо более низкого порядка, типичный БИХ-фильтр может быть второго порядка (5 коэффициентов), в то время как типичный КИХ-фильтр для той же задачи может иметь тысячи коэффициентов.
Шнарф

4

Почти во всех случаях ваш лучший выбор - это не свертка и не БПФ, а просто применение фильтра БИХ напрямую (например, с помощью функции sosfilt ()). Это будет значительно более эффективным с точки зрения использования процессора и памяти.

Будет ли это иметь числовое значение, зависит от конкретного фильтра. Единственный случай, когда может появиться какое-то различие, это если полюса расположены очень, очень близко к окружности юнитов. Даже есть несколько хитростей, которые могут помочь. НЕ ИСПОЛЬЗУЙТЕ представление передаточной функции и filter (), но используйте полюсы и нули с sosfilt (). Вот пример для разницы.

n = 2^16;  % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');

filter () работает плохо при частоте среза около 15 Гц при 44,1 кГц. Для функции sosfilt () отсечка может быть намного ниже 1/100 Гц при 44,1 кГц без каких-либо проблем.

Если у вас есть проблемы со стабильностью, БПФ тоже мало чем поможет. Поскольку ваш фильтр является БИХ-фильтром, импульсный отклик бесконечен и должен быть сначала усечен. На этих очень низких частотах импульсный отклик становится настолько длинным, что БПФ также становится непрактичным.

Например, если вы хотите срезать 1/100 Гц при 44,1 кГц и хотите, чтобы динамический диапазон при импульсной характеристике составлял 100 дБ, вам нужно примерно 25 миллионов выборок !!! Это почти 10 минут при 44,1 кГц и во много, много раз дольше, чем ваш исходный сигнал


Это на самом деле не отвечает на вопрос о численных проблемах, но я не знал о проблемах с filter- спасибо! Мой верхний предел составляет 0,5 Гц при 250 Гц. В чем причина проблем с filter? Я пишу реализацию самостоятельно.
Андреас

2

Почему вы думаете, что все будет иначе? Теоретические концепции должны перейти к практическим приложениям, с той лишь разницей, что проблемы с плавающей запятой, от которых мы не можем избежать. Вы можете легко проверить на простом примере в MATLAB:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

Как видите, ошибки имеют порядок точности станка. Не должно быть никаких причин не использовать метод FFT. Как упоминал Эндолит, гораздо более распространенным является использование подхода FFT для фильтрации / свертки / взаимной корреляции и т. Д., Причем намного быстрее, за исключением очень маленьких выборок (как в этом примере). Не то, чтобы обработка во временной области никогда не выполнялась ... все сводится к применению, потребностям и ограничениям.


1
Я думаю, что первоначальный вопрос заключался в том, чтобы разобраться в проблемах с плавающей точкой, присущих фильтрации на основе БПФ, по сравнению с прямой реализацией фильтра во временной области. Это может быть серьезной проблемой для обработки сигналов с фиксированной запятой, например, если у вас действительно длинные фильтры или плохая реализация FFT. Вы точно не увидите никаких эффектов для последовательностей длиной 5 с плавающей запятой двойной точности.
Джейсон Р

@JasonR Ошибки все еще имеют машинную точность, если вы увеличите длину последовательностей до 1e6 в примере выше. Ошибки, о которых вы упомянули, возникают главным образом из-за плохой конструкции фильтра или неправильной реализации FFT. Если все в порядке, я не понимаю, почему свертка во временной области должна давать ответ, отличный от свертки в частотной области.
Lorem Ipsum

1
Он не должен давать разный ответ в зависимости от того, в какой области вы выполняете вычисления. Единственное, что я хочу сказать, - это то, что фактические математические операции сильно различаются между двумя подходами, поэтому в зависимости от реализаций каждого из них, который у вас есть, возможно, что вы мог видеть ощутимые различия. Для двойной точности, при условии, что у вас есть хорошие реализации, я не ожидал бы никакой разницы, за исключением крайних случаев.
Джейсон Р
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.