Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Спектральный анализ   Найти похожие ветки 

 
Углук ©   (2007-04-17 22:15) [0]

Есть массив отсчетов функции и массив ряда Фурье
Нужно применить весовую функцию для улучшения вида спектрограммы( для того, чтобы шумы были менее заметны)
Весовая функция, например, такая:
http://www.nsu.ru/education/cmet/node38.html, формула (14).

Как мне связать эту весовую функцию и i-й элемент моего массива?


 
TUser ©   (2007-04-18 03:29) [1]

БПФ, сначала прямое, потом твоя функция, потом обратное.


 
Jeer ©   (2007-04-18 09:41) [2]


> Нужно применить весовую функцию для улучшения вида спектрограммы(
> для того, чтобы шумы были менее заметны)


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

Для снижения шумов используются фильтры.
Если говорить о нерекурсивных фильтрах, то можно сказать, что тоже выполняется умножение на весовую функцию фильтра, но в общем случае размерность фильтра не равна размерности данных, а, как правило, меньше.

Приведу пример расчета весовых множителей fWk[] - разобраться вполне можно:)
Эта процедура из состава фильтра класса FIR, но подойдет для windowing перед выполнением FFT.

Procedure TFIR.SetFilter(FType: TFilterType = ftAverage; BFType: TBFType = bftLowPass; WType: TWindowedType = wtHamming; FS: double = 0.1 );  // FS - normalyzed freq 0 - 0.5  FS = Ftrunc/Fsampling
var i,k,N,NN: integer;
   AA,BB,AK,AF1,D,ARG: double;
Begin
 N:= fCount;
 case FType of
   ftNone:
begin
   for i:= 0 to N-1 do fW [i] := 0; // None filtering
   fW[0] := 1;
end;
   ftMean:
for i:= 0 to N-1 do fW [i] := 1.0 / N; // Mean filter

   ftAverage:
for i:= 0 to N-1 do
 fW [i] := 2*(2*N-1)/((N+1)*N) - 6*i/((N+1)*N); // weights for average filter 1-level
   ftFIR:
begin
         if odd(N) then AA := 0.0 else AA := 0.5;
         NN := N div 2;
         BB := NN - AA;
         ARG := PI/BB;
         fW[NN] := 2*FS;
         for i := 1 to NN do begin
           k := NN - i;
           AK := i - AA;
           D := PI*AK;
           AF1 := 2*D*FS;
           fW[k] := sin(AF1)/D;
           case WType of
             wtNone: ; // None
             wtHamming:  winHamming(fW[k],ARG*AK);  // Hamming
             wtHann:     winHann(fW[k],ARG*AK);
             wtBlackman: winBlackman(fW[k],ARG*AK);
             wtBarlett:  winBarlett(fW[k],ARG*AK);
             wtLancoz:   winLancoz(fW[k],ARG*AK,0.5);
           end;
           fW[NN + i - 1] := fW[k];
         end;
end;
 end;
end;

procedure winHamming(var value: double; arg: double);
begin
 value := value*(0.54+0.46*Cos(arg));
end;


 
Углук ©   (2007-04-18 17:35) [3]

Спасибо



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

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.045 c
2-1177671216
bubec
2007-04-27 14:53
2007.05.20
проблема с Timаge


9-1150618621
ors_archangel
2006-06-18 12:17
2007.05.20
Сихнронизация компов игры


1-1174589370
Кто ответит на вопрос?:)
2007-03-22 21:49
2007.05.20
Управление Excel-ем


6-1163694731
Tiberius
2006-11-16 19:32
2007.05.20
Текст из браузера


2-1177920614
Regent
2007-04-30 12:10
2007.05.20
ПЕРЕВЕСТИ Дробное число в строку.