2017-01-08 16 views
1

信号処理が新しく、fftを使用してローパスフィルタを適用したいと考えています。 私の質問に答えてthis postが見つかりました。私のカットオフ周波数が3500Hzでサンプリングレートが25600Hzの場合、 eigenchris 'answerのコードで指定されているように、ガウス曲線を生成する際に使用する値はsigmaです。以下はガウス関数のシグマ変数の選択

gauss = zeros(size(Y));  
sigma = 8;       % just a guess for a range of 20 

gauss(1:r+1) = exp(-(1:r+1).^ 2/(2 * sigma^2)); % +ve frequencies 
gauss(end-r+1:end) = fliplr(gauss(2:r+1));   % -ve frequencies 
y_gauss = ifft(Y.*gauss,1024); 

私が使用しています機能コードです:

以下
clf; clc; 
Fs = 25600; 
file = '01cKhaitan181015M4_Opp_LeftS1H8_a.dat'; 
signal = dlmread(file); % read file from specified location 
signal = signal - mean(signal); 

N  = size(signal, 1); 
time = 1000*(0 : N-1)/Fs; % in msec 
freq = (-Fs/2 : Fs/N : Fs/2-Fs/N)'; 

Y = fft(signal, 1024); 

r = 141; % range of frequencies we want to preserve 

gauss = zeros(size(Y)); 
sigma = 119.75; 
gauss(1:r+1) = exp(-(1:r+1).^ 2/(2 * sigma^2)); % +ve frequencies 
gauss(end-r+1:end) = fliplr(gauss(2:r+1));   % -ve frequencies 
y_gauss = ifft(Y.*gauss,1024); 

hold on; 
plot(time, signal, 'k'); plot(time, abs(y_gauss), 'c'); 
legend('signal', 'gaussian', 'Location', 'southwest') 
hold off; 

は、カットオフ周波数はどこ周波数として定義されたデータファイルのリンク

https://www.dropbox.com/s/edb8g43j4a54jvq/01cKhaitan181015M4_Opp_LeftS1H8_a.dat?dl=0

答えて

0

です減衰は0.5または〜6dBです。希望のカットオフ周波数が3500Hzになっています。あなたが希望0.5減衰を持ちたいということcutoff_index

cutoff_frequency = 3500; 
sampling_rate = 25600; 
cutoff_index = 1 + cutoff_frequency/sampling_rate * length(Y); 

:次のステップはで対応するインデックスを取得することです。

%% Derivation of sigma value 
% 0.5 = exp(-cutoff_index^2/(2 * sigma^2)); 
% log(0.5) = -cutoff_index^2/(2 * sigma^2)); 
% sigma^2 = -cutoff_index^2/(2 * log(0.5)); 
% sigma^2 = cutoff_index^2/(2 * log(2)); 

が生じる:あなたのガウス式でcutoff_indexで0.5の減衰が得られsigmaについて解くと、たとえばlength(Y)が1024であれば

sigma = cutoff_index/sqrt(2 * log(2)); 

そう、あなたはなるだろう

sigma = (3500/25600 * 1024)/sqrt(2 * log(2)); % approx. 119.75 
+0

計算されたシグマを使用している間、フィルタデータプロットは生プロットと大きく異なります。何か問題や理解?確認するために、私はmatlab関数とデータファイルを追加しています。 –

+0

いくつかの事柄があります:** 1)** 'fliplr'は、引数が列ベクトルの場合、その順序を逆転しません。 'gauss(r + 1:-1:2)'を使うことができます。これは 'fliplr(gauss(2:r + 1))の代わりに行ベクトルか列ベクトルかにかかわらず動作します。 ** 2)**時間信号を比較する場合は、おそらく 'abs(y_gauss) 'の代わりに' y_gauss'をプロットするべきです。 ** 3)** 'r'をもう少し増やすと、周波数漏れが少し少なくなります。 – SleuthEye

+0

フィルタ時間プロットは信号と一致し、ポイント2で指摘されている間違い(abs()を使用)。提案3 - > rを変えることによって、シグマは影響を受けますか?他の言葉では、シグマとrは関連していますか? –