Форум: "Прочее";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизСпектральный анализ Найти похожие ветки
← →
Углук © (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.043 c