2017-11-29 29 views
-1

나는 FFT (고속 푸리에 변환)로 필터링 된 간섭계의 신호를 가지고있어 필터 자체가 정상적으로 작동합니다. 들어, 내가 선택한 범위에서 신호를 필터링, 나는 또한 모든 범위 에서이 작업을 수행 할 수 있지만 부품 및 필터/분석 각 부분에이 신호를 잘라, 자동으로 할 수 또는 범위를 입력 할 수 있습니다. 내가 원하는. 이걸 자르려면 아마도 창을 써야 할 것 같은데?차트에서 부품으로 신호 나누기

프로그램의 스크린 샷 :

enter image description here

enter image description here

모든 파일에 대한 링크 : here, herehere.

내 코드 :

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

분석 범위가 선험적이라면 세 가지 범위 모두에서 작동하는 루프를 프로그램하면됩니다. 범위 알고리즘을 사용하여 범위 경계를 정의해야한다면 더 어려울 것입니다. 나는 회답에 대한 제안을 제안 할 것이다. –

+4

게시물을 파손하지 마십시오. – Riker

답변

0

세 가지 매개 변수를 분석하려면 당신이이 제 당신이 당신의 프로그램을 수정 할 수 있어야한다

% 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

범위를 어떻게 세분화해야하는지 설명 할 수 없다면, 그 일을하는 알고리즘을 어떻게 작성해야합니까? 책상으로 돌아가 숙제를하고 알고리즘이 원하는 것을 생각하십시오. 나는 당신의 말에서 아직 그것을 이해할 수 없었다. 죄송합니다 –