Цифровая фильтрация сигнала | Крымский форум

Цифровая фильтрация сигнала

  • Добро пожаловать на форум! Рады видеть вас здесь! Зарегистрируйтесь или Войдите в аккаунт, чтобы иметь полный доступ к площадке!

svip

Местный житель
Ветеран
Сообщения
1,535
Реакции
9
Репутация
13
Кто нибудь сталкивался на практике с цифровой фильтрацией сигналов???? не в теории, типа преобразование Фурье и тд. А именно на практике в программировании, ну или хотя бы в математике, но с понятным алгоритмом.

В общем есть сигнал полосой 20Гц-50КГц из него нужно вырезать полосу 2-5 Гц. Как быть???
 
если полоса от 20Гц, где ты возмешь 2-5Гц ???
в саундфорже море фильтров под это дело, если не риалтайм
если реалтайм, то такое делал давненько в винампе, с линейного цифровалось и плугинсы это дело шуршали, правда был простой дсп фильтр, для сочности звучания ...

п.с. если ты думаешь вырезать голос, то не мечтай, 100% голос не вырезается, особенно в музыке
 
Не голос резать не нужно.
smile.gif

Полоса 2-5 Гц - это или 20-25Гц или 106-109 Гц или 233-238Гц и тд

Вот набросал рисунок чтобы было понятнее.
[attachmentid=8154]
P.S. Извеняюсь за качество нарисованного, просто под рукой кроме пайнта ничег не оказалось.
smile.gif
 

Вложения

  • filter.GIF
    filter.GIF
    4.3 KB · Просмотры: 1
Изучил, но что то толком мало что понял. В асме не силен, а блог схемы совсем специфические.
В общем нашел пример кода преобразования фурье
Код

unit fft;
interface
uses Math, Ap, Sysutils;

procedure FastFourierTransform(var a : TReal1DArray;
nn : Integer;
InverseFFT : Boolean);

implementation

(*************************************************************************
Быстрое преобразование Фурье

Алгоритм проводит быстрое преобразование Фурье комплексной
функции, заданной nn отсчетами на действительной оси.

В зависимости от переданных параметров, может выполняться
как прямое, так и обратное преобразование.

Входные параметры:
nn - Число значений функции. Должно быть степенью
двойки. Алгоритм не проверяет правильность
переданного значения.
a - array [0 .. 2*nn-1] of Real
Значения функции. I-ому значению соответствуют
элементы a[2*I] (вещественная часть)
и a[2*I+1] (мнимая часть).
InverseFFT
- направление преобразования.
True, если обратное, False, если прямое.

Выходные параметры:
a - результат преобразования. Подробнее см.
описание на сайте.
*************************************************************************)
procedure FastFourierTransform(var a : TReal1DArray;
nn : Integer;
InverseFFT : Boolean);
var
ii : Integer;
jj : Integer;
n : Integer;
mmax : Integer;
m : Integer;
j : Integer;
istep : Integer;
i : Integer;
isign : Integer;
wtemp : Double;
wr : Double;
wpr : Double;
wpi : Double;
wi : Double;
theta : Double;
tempr : Double;
tempi : Double;
begin
if InverseFFT then
begin
isign := -1;
end
else
begin
isign := 1;
end;
n := 2*nn;
j := 1;
ii:=1;
while ii<=nn do
begin
i := 2*ii-1;
if j>i then
begin
tempr := a[j-1];
tempi := a[j];
a[j-1] := a[i-1];
a[j] := a;
a[i-1] := tempr;
a := tempi;
end;
m := n div 2;
while (m>=2) and (j>m) do
begin
j := j-m;
m := m div 2;
end;
j := j+m;
Inc(ii);
end;
mmax := 2;
while n>mmax do
begin
istep := 2*mmax;
theta := 2*Pi/(isign*mmax);
wpr := -2.0*sqr(sin(0.5*theta));
wpi := sin(theta);
wr := 1.0;
wi := 0.0;
ii:=1;
while ii<=mmax div 2 do
begin
m := 2*ii-1;
jj:=0;
while jj<=(n-m) div istep do
begin
i := m+jj*istep;
j := i+mmax;
tempr := wr*a[j-1]-wi*a[j];
tempi := wr*a[j]+wi*a[j-1];
a[j-1] := a[i-1]-tempr;
a[j] := a-tempi;
a[i-1] := a[i-1]+tempr;
a := a+tempi;
Inc(jj);
end;
wtemp := wr;
wr := wr*wpr-wi*wpi+wr;
wi := wi*wpr+wtemp*wpi+wi;
Inc(ii);
end;
mmax := istep;
end;
if InverseFFT then
begin
I:=1;
while I<=2*nn do
begin
a[I-1] := a[I-1]/nn;
Inc(I);
end;
end;
end;


end.



но как ту можно задать границы "вытаскиваемой" полосы??? или я чего то не понимаю.

P.S. нужно было лучше учить МатАнализ
smile.gif
 
Цитата
Изучил, но что то толком мало что понял. В асме не силен, а блог схемы совсем специфические.
В общем нашел пример кода преобразования фурье


Цитата

но как ту можно задать границы "вытаскиваемой" полосы??? или я чего то не понимаю.
P.S. нужно было лучше учить МатАнализ


Границы задавать не надо. Преобразование Фурье позволяет:
- из исходного сигнала получить его спектр(сумму коэфициентов Sin и Cos некой частоты F и её гармоник 2F, 3F ...)
это называется прямым преобразованием фурье.
- Из спектра обратно получить исходный сигнал - это обратное преобразование.

Чтобы вырезать некоторую полосу частот, надо просто коэфициенты перед sin,cos попадающими в эту полосу обнулить. Те, делаем прямое преобр. обнуляем коэф. и потом делаем обратное.

В математике все эти преобразования - интегралы. В реальности, так как имеем дело с дискретными сигналами(со звуковухи идет 44kHz например), интеграл превращается в сумму...

Надо сначала определится, какие параметры исходного сигнала, какую полосу вырезать и тд.
 
Еще, приведенный паскалевский код это БПФ(FFT) - быстрое преобразование фурье, хитрый алгоритм.
Если для обычного преобразования из N исходных элементов, требуется выполнить N^2 операций, то при БПФ
всего лишь N*log2(N).
Но есть ограничение, при БПФ число исходных элементов должно быть степенью 2, те 256, 512 ...

http://ru.wikipedia.org/wiki/%D0%91%D0%9F%D0%A4
 
Назад
Сверху