2013-01-25 2 views
0

더 높은 주파수를 제거하는 필터를 구현하고 싶습니다. 이 예제에서는 죄 곡선을 제거하고 선형 곡선을 유지하려고합니다.은 저 대역 통과 필터를 구현했습니다.

EDIT 그러나 I 필터링 구현 함수가 수용하지 않은 상당한 데이터의 에지 변화

제가 정정 코드

.

clc; clear all; 
xaxis = linspace(1, 10, 1000); 
data = xaxis + sin(xaxis*3); 
Nf = 2^12; 
xAxisf = linspace(-10,10,Nf); 
% plot(xaxis, data); 

% FFT 

xsize = numel(data);  
Xf = zeros([1 Nf]); 
indices = Nf/2-floor(xsize/2):Nf/2-floor(xsize/2)+xsize - 1; 
Xf(indices) = data; 

% Xf = fftshift(Xf); 
Xf = fft(Xf); 
Xf = fftshift(Xf); 

% plot 
Xfa = abs(Xf); plot(xAxisf, Xfa); 

% generate super-gaussian filter function 
Nf = numel(Xf);  
widthfilter = 0.12; 
filterpower = 2; 
filter = exp(-(xAxisf.^2./widthfilter^2).^filterpower); 

% filter 
filtertimes = 20; 
Xf = Xf .* filter.^filtertimes; 

% plot 
Xfa = abs(Xf); plot(Xfa); 

% iFFt 
Xfs = ifftshift(Xf); 
Xif = ifft(Xfs); 
% Xif = ifftshift(Xif); 
result = abs(Xif); 

plot(result(indices)) 
+1

역 변환을하기 전에 abs를 사용했기 때문에. –

+0

당신 말이 맞아요. 복근은 필요한 음모에 대해서만 사용되었습니다. 그러나 필터링은 현재 작동하지 않습니다. –

답변

4

첫 번째 문제 :

Xf = fftshift(data);  % NOT NEEDED 
    Xf = fft(Xf); 
    Xf = fftshift(Xf); 

는 FFT 전에 데이터를 fftshift하지 마십시오. 교대는 fft 후에 만 ​​필요합니다. 이것은 radix-n (아마도 2) fft가 프로세스의 데이터를 "데시 메이트"하기 때문입니다. 데시 메이트되지 않았으므로 전에 고칠 필요가 없습니다.

번째 문제 :

Xfs = ifftshift(Xf); 
    Xif = ifft2(Xfs);    
    Xif = ifftshift(Xif); % NOT NEEDED 

ifftshift의 데이터를 데시 메이트 (decimate) 재 - 입력으로서 필요 IFFT (fftshift 실행을 취소). ifft의 출력은 입력이 이미 데시 메이션 된 경우 원본 신호를 재구성합니다. 뒤에서 바꾸지 마십시오.

세 번째 문제 :

가 갑자기 IFFT 왜 세계는 2D로 전환 않았다
Xfs = ifftshift(Xf); 
    Xif = ifft2(Xfs);  % USE ifft INSTEAD OF ifft2  
    Xif = ifftshift(Xiff); 

?

필터 코드를 자세히 보지 않았지만 로우 패스 필터를 원한다면 중점을 중심으로 대칭이되어야한다고 말하고 싶습니다. 그렇지 않으면 주파수 응답이 대칭이 아니므로 상상의 무리로 끝날 것입니다.

제목을 변경하십시오. 이것은 "푸리에 필터"가 아닙니다. 윈도우 메소드와 fft를 사용하는 로우 패스 필터입니다. 주파수 공간에서 창을 적용한다는 점에서의 창.

좋아, 늦었고, 앞뒤로 괴팍하게되고있다. 그냥 도우려고 노력하고있다. 더 빨리 나를 위해 코드를 작성하십시오.

코드에서 필터의 효과를 찾으려면 필터의 차단 주파수가 너무 높거나 데이터의 사인파의 빈도가 높기 때문에 불가능합니다. 너무 낮습니다. 다음은 입력 사인파의 진동 주파수를 증가시킨 버전입니다.

clc; clear all; 
xaxis = linspace(1, 10, 1000); 
data = xaxis + sin(xaxis*10); 
% plot(xaxis, data); 

% FFT 
Xf = data; 
Xf = fft(Xf); 
Xf = fftshift(Xf); 

% generate super-gaussian filter function 
Nf = numel(data); 
xAxisf = linspace(-5,5,Nf); 
widthfilter = 0.1; 
filterpower = 2; 
filter = exp(-(xAxisf.^2./widthfilter^2).^filterpower); 

% filter 
filtertimes = 1; 
Xf = Xf .* filter.^filtertimes; 

% plot 
Xfa = abs(Xf); plot(Xfa); 

% iFFt 
Xfs = ifftshift(Xf); 
Xif = ifft(Xfs); 
result = abs(Xif); 

plot(result); hold on; plot(data,'r'); 
    legend('filtered','data'); 

안녕히 주무세요! 내 공공 ​​봉사를했다 : p

+0

fft2는 내가 복사 한 코드에서 왔습니다. 그러나 그것은별로 변하지 않습니다. 변경은 필요하지 않을 수도 있지만 변경하지는 않습니다. 저역 통과 필터는 대칭이어야합니다. 왜 대칭이 아니어야하는지 모르겠다. –

+0

게시물에 새 코드를 추가하십시오. – thang

+0

수정 사항을 현재 코드로 업데이트했습니다. 나는 fft에 훨씬 더 큰 배열을 사용한다. –

관련 문제