2017-11-29 18 views
-1

私はFFT(高速フーリエ変換)でフィルタリングされた干渉計からの信号を持っており、フィルタ自体は正常です。 今のところ、私が選択した範囲の信号をフィルタリングします。私はこれを全範囲で行うこともできますが、この信号を部分とフィルタ/分析の各部分にカットしたいのですが、それを自動的に行うか、が欲しいです。これをカットするには、おそらくいくつかのウィンドウを使用する必要がありますか?チャート上の部分への信号分割

プログラムのスクリーンショット:

enter image description here

enter image description here

すべてのファイルへのリンク:hereherehere

マイコード:

clear all; 
close all; 
clc; 
file_name = 'W0009.dat'; 
[lam, I] = read_spectrum(file_name); 
lam = lam*1e-3; 
figure(1) 
plot(lam,I, '-k');hold on; 

mask = lam >= 1.6 & lam <= 1.8; 
N = sum(mask); 
w = hamming(N); 

if mod(N, 2) == 0 
    f = (-fix(N/2) : fix(N/2) - 1)/N; % czestotliwości dla N parzystego 
else 
    f = (-fix(N/2) : fix(N/2))/N; % czestotliwości dla N nieparzystego 
end 

F = 2*fftshift(fft(I(mask)))/N; 
W = fftshift(fft(I(mask).*w)); 

m = abs(f) <= 0.04; 
F(not(m)) = 0; 

figure(2) 
semilogy(f, abs(F), '-k');hold on; 
% semilogy(f, abs(W), '-r');hold on; 

fI = -abs(N*ifft(fftshift(F))/2); 
figure(3); 
plot(lam(mask), I(mask), '-k');hold on; 
plot(lam(mask), fI, '-r'); 

% M = 258; b = fir1(M, 0.45); 
% I1 = I; 
% I1 = filter(b, 1, I1); I1(1 : end - floor(M/2)) = I1(floor(M/2) + 1 : end); 
% I1 = filtfilt(b, 1, I1); 
% plot(lam,I1);hold on; 
% 
% M = 38; b = fir1(M, 0.15); 
% I2 = I; 
% I2 = filter(b, 1, I2); I2(1 : end - floor(M/2)) = I2(floor(M/2) + 1 : end); 
% I2 = filtfilt(b, 1, I2); 
% plot(lam,I2);hold on; 
% 
% M = 52; b = fir1(M, 0.05); 
% I3 = I; 
% I3 = filter(b, 1, I3); I3(1 : end - floor(M/2)) = I3(floor(M/2) + 1 : end); 
% I3 = filtfilt(b, 1, I3); 
% plot(lam,I3);hold on; 
% 
% fm1 = lam < 1.8394 & lam > 1.5584; 
% Ifinal1 = I1(fm1); 
% fm2 = lam > 1.8394 & lam < 1.98138; 
% Ifinal2 = I2(fm2); 
% fm3 = lam < 2.216 & lam > 1.98138; 
% Ifinal3 = I3(fm3); 
% lamfinal = [lam(fm1);lam(fm2);lam(fm3)]; 
% Ifinal = [Ifinal1;Ifinal2;Ifinal3]; 
% close; 
% figure(2) 
% plot(lamfinal,Ifinal); hold on; 
% 
% nlam = linspace(lamfinal(1), lamfinal(end), 9*length(lamfinal)).'; 
% nI = interp1(lamfinal, Ifinal, nlam, 'spline'); 
% plot(nlam,nI); 
% 
% close; 
% figure(3) 
% [PKS1,LOCS1]= findpeaks(nI); 
% plot(nlam,nI);hold on; 
% plot(nlam(LOCS1),PKS1,'or'); hold on; 
% [PKS2,LOCS2]= findpeaks(-nI,'MinPeakWidth',25); 
% % PKS1 = [PKS1(1:73);PKS1(75:end)]; 
% % LOCS1 = [LOCS1(1:73);LOCS1(75:end)]; 
% % PKS2 = [PKS2(1:75);PKS2(77:end)]; 
% % LOCS2 = [LOCS2(1:75);LOCS2(77:end)]; 
% plot(nlam(LOCS2),-PKS2,'or'); 
% axis tight; 
+0

「信号を部分的にカットする」ためにどのような基準を使用するかはまだわかりません。手動でどうやってやるの?どの部分を選択しますか? –

+0

解析範囲が先験的にわかっている場合は、3つの範囲すべてを処理するループをプログラムするだけで済みます。範囲の境界をいくつかのアルゴリズムで定義する必要がある場合は、より難しくなります。私は答えにループの提案を入れます。 –

+4

あなたの投稿を誹謗中傷しないでください。 – Riker

答えて

0

3つのパラメータを解析するためには、あなたがこの中にあなたのプログラムを修正することができるはず

% Definition of ranges 
ranges = [1.2,1.6 ; 1.6, 1.8 ; 1.8, 2.4]; 
% Number of ranges defined 
nRanges = size(ranges,1); 
% loop over ranges 
for i=1:nRanges 
    % ... some stuff from your program 
    % Define the masking area 
    mask = lam >= ranges(i,1) & lam <= ranges(i,2); 
    % ... more stuff from your program 
end 

ループでそれらこれらの第一およびプロセスを定義することができます範囲方法。

+0

範囲を細分する方法をあなたの言葉で説明できない場合は、その仕事をするアルゴリズムをどのように書くべきでしょうか?あなたの机に戻り、宿題をして、あなたのアルゴリズムがあなたのために何をしたいか考えてください。私はまだあなたの言葉からそれを理解できませんでした。ごめんなさい –

関連する問題