Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Вниз

Low-pass filter   Найти похожие ветки 

 
Yr2   (2004-02-02 14:34) [0]

Есть оцифрованный сигнал (например, электрокардиограмма, звук и т.п.) Нужно отфильтровать все частоты от нуля до заданной. Может кто-нибудь подскажет исходники низкочастотного фильтра?
С уважением.


 
Digitman   (2004-02-02 14:41) [1]

в общем случае см. алгоритмы быстрого прямого/обратного преобразования Фурье (FFT - Fast Fourier Transforming)

конкретных реализаций этих алгоритмов в сети навалом


 
Brahman   (2004-02-02 14:47) [2]

Для начала, необходимо определить требования к фильтру:
- полоса пропускания с заданной неравномерностью;
- полоса затухания -"-
- "крутизна" скатов АЧХ
- тип реализации IIR/FIR

Простейший фильтр НЧ (первого порядка)
Затухание -6 дБ на декаду

// Инициализация
// tau - период дискретизации
// Ws = 1/T - частота среза по уровню 0.7
// X - входное значение

B := exp(-tau/T);
A := 1 - B;
Yii := 0;
...

//Фильтрация:
Yi := A*X + B*Yii;
Yii := Yi;


 
Brahman   (2004-02-02 14:48) [3]

Digitman © (02.02.04 14:41) [1]
в общем случае см. алгоритмы быстрого прямого/обратного преобразования Фурье (FFT - Fast Fourier Transforming)

Это слишком:)
В зависимости от условий наверняка можно проще.


 
Digitman   (2004-02-02 15:00) [4]


> Brahman © (02.02.04 14:48) [3]


а завтра наверняка его условия изменятся и потребуют более глубокого анализа/синтеза .. так что лучше сразу реализовать FFT , чтобы потом не было проблем с переделкой программы под новые условия


 
Yr2   (2004-02-02 15:09) [5]

To Brahman
Требования к фильтру:
1. В идеале АЧХ должна быть Г-образной, причём "Г" повернуто в другую сторону.
2. Частота среза должна задаваться в виде параметра функции фильтра, причём её значение 200-400 Гц.
Правильно ли я понимаю, что, чтобы приблизиться к "идеалу", мне нужно поставить последовательно несколько фильтров 1-го порядка? Или формулы расчёта для фильтра N-го порядка другие?
"тип реализации IIR/FIR" - не оговаривается. Можете уточнить, что это меняет?
И последний вопрос: не совсем пока понял роль функции exp(-tau/T); Можно её заменить "мгновенным обрезанием"?

To Digitman
Не хотелось Вам отвечать, но это сделал Brahman. FFT-варианты я уже просмотрел. Это слишком ресурсоемко. Да и не нужно в задаче получать спектр (пусть промежуточный) из N частот.


 
TUser   (2004-02-02 15:11) [6]

Если проще - тогда использвать какую-нибудь матрицу. Ищи на слова "mathematical morphology"


 
Digitman   (2004-02-02 15:22) [7]


> Yr2 (02.02.04 15:09) [5]



> FFT-варианты я уже просмотрел. Это слишком ресурсоемко


как будет угодно.
наше дело - предложить ..

по поводу же ресурсоемкости в целом не соглашусь
это сильно зависит от предполагаемого входного спектра и задействования и эффективного использования MMX/SSE-инструкций в коде, реализующем конечный алгоритм преобразования

к тому же вынужденное каскадирование Фильтров 1-го порядка (для достижения требуемой результирующей АЧХ) будет ощутимо уменьшать производительность алгоритма такого каскадного фильтра в целом, приближая ее к производительности FFT-алгоритма


 
Brahman   (2004-02-02 16:03) [8]

С "идеалом" все понятно, но идеального не бывает, как мы знаем.

Для практических применений вполне бывает достаточно фильтра
4-6 порядка (2-3 фильтра второго порядка, если делать какадную реализацию)

Фильтр первого порядка приведен как простейший случай.
Это RC-цепь с экспонентциальной переходной характеристикой и поэтому там exp(..)

Выбор IIR/FIR - меняет сложность реализации/расчета и еще некоторые параметры

IIR (по старому БИХ-фильтр или фильтр с "бесконечной" памятью)
Для реализации ФНЧ второго порядка:

Result := fGain * (fB0*(fValue + 2*Xi + Xii) - (fA1*Yi + fA2*Yii));

Т.е. обязательных 4 сложения и 4 умножения.
Для фильтра 6 -го порядка (каскадное соединение 3х ФНЧ второго порядка) имеем: по 12 сложений и умножения.
Никакой FFT такого сравнения не выдержит:)

FIR-фильтры (КИХ-фильтры) более ресурсоемки, тк реализуют операцию свертки y = sum(Ai*Xi)
Для создания FIR-фильтра, аналогичного по фильтрующим свойствам IIR-фильтру шестого порядка достаточно i = (100).
Т.е. это будет по 100 сложений/умножений.

Если операция производится не в real-time, то это все мелочи.


 
Brahman   (2004-02-02 16:08) [9]

Инициализация IIR-фильтра:
vFc - частота среза, Гц
vFs - частота дискретизации, Гц
vDzeta - параметр "колебательность" и при 0.707 - стандартный фильтр Баттерворта
vGain - коэф.усиления

Procedure TFilterBQ.SetFilter(vFc,vFs,vDzeta,vGain: double);
var d1,d2,denom: double;
begin
Clear;
fFc := vFc; fFs := vFs; fDzeta := vDzeta; fGain := vGain;
fKs := 0.5/tan(PI*fFc/fFs);
d1 := 4*fDzeta*fKs;
d2 := 4*fKs*fKs;
denom := 1 + d1 + d2;
fB0 := 1/denom;
fA1 := 2*(1 - d2)/denom;
fA2 := (1 - d1 + d2)/denom;
end;


 
Yr2   (2004-02-02 16:32) [10]

To Brahman:
Спасибо. Я сделал фильтр первого порядка как Вы написали в [2].
Это работает. Единственно, что изменил присвоение Yii:=0; на Yii:=Massiv[0] - это не искажает начало сигнала.
Уже вижу, что одного каскада маловато. Попробую Ваш код [9].
Уточните, пожалуйста, что есть vDzeta? как его оценить и какие из практики ставят значения?


 
Brahman   (2004-02-02 17:02) [11]

dzeta - параметр "колебательность"
При 0.707 (sqrt(2)) - получается фильтр Баттерворта
(максимально плоская полоса пропускания)


 
Yr2   (2004-02-02 17:58) [12]

Спасибо, Brahman. Ваш алгоритм работает. Но я наблюдаю небольшие странности. Наверное я неправильно понял некоторые переменные.
Если, как Вы пишете, dzeta = sqrt(2), то это не 0.707, а 1.41.
И не могли бы Вы точно написать, как в формуле
Result:=fGain * (fB0*(fValue + 2*Xi + Xii) - (fA1*Yi + fA2*Yii));
вычисляются переменные Yi, Yii, Xi, Xii. Совпадает ли значение Xi с fValue? Или это предыдущий отсчёт?


 
Brahman   (2004-02-02 19:15) [13]

Не углядел: dzeta = 1/sqrt(2) = 0.707...

fValue, X - входные отсчеты, Y - выходные.

fValue == X(i) - текущий
Xi == X(i-1)
Xii == X(i-2)
Result == Y(i) - текущий
Yi == Y(i-1)
Yii == Y(i-2)


 
Brahman   (2004-02-02 20:06) [14]

Если будете каскадировать ФНЧ, то для правильного расчета необходимо учесть следующее
Коэффициент передачи одиночного фильтра на частоте среза Ws составляет 1/sqrt(2) == -3 dB
Если будем использовать трехзвенный фильтр, то на частоте Ws
получим общий коэффициент передачи
Ks = (0.707..)^3 = 0.35
Для того, чтобы обеспечить на частоте Ws общий коэф.передачи
0.707.. (-3дБ) необходимо увеличить частоту среза W1s одиночного
фильтра, так чтобы на частоте Ws каждое звено имело бы коэффициент передачи
(sqrt(2))^(1/3) = 0.8910

АЧХ фильтра Баттерворта
H(W) = 1/(sqrt((W/W1s)^2*n+1))
При n=2(порядок одиночного фильтра) и известных W = Ws и H(W)=0.8910 можно найти частоту среза одиночного фильтра W1s = sqrt(2)*Ws = 1.414*Ws


 
Yr2   (2004-02-02 20:43) [15]

To Brahman
Всё, большое спасибо! Вы меня удовлетворили :) Точнее, Ваш фильтр 2-го порядка :)
Теперь отфильтрованный сигнал выглядит так как и должен выглядеть.

P.S. Жаль что в форуме нельзя бутылку пива передать...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.035 c
1-38866
download
2004-02-04 22:19
2004.02.13
Как убить поток


1-38882
Sergioly
2004-02-04 15:58
2004.02.13
Передача данных из Win в Dos-программу


14-39054
pumba
2004-01-24 18:33
2004.02.13
Народ, как вступить в ФИДО?


11-38764
BelchonokH
2003-05-18 19:09
2004.02.13
как можно заменить AllocateHWnd ?


1-38912
Olivka
2004-02-04 12:21
2004.02.13
Параметры запроса в FIBdataset.UpdateSQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский