2010-12-31 2 views
1

나는 부분 지연 필터를 설계하고 있으며, 5 h (n) 차수 계수는 시간 영역에서 6 탭을 가지고 있습니다. 나는 h (n) x (n)은 matlab를 사용하여 5000 샘플 신호와 convolute 테스트 결과를 확인 보인다. FFT 및 IFFT 메서드를 사용하려고하면 출력이 완전히 잘못되었습니다. 사실 내 FFT는 주파수 도메인에서 8192 데이터로 계산됩니다.이 데이터는 5000 신호 샘플에 대해 2의 가장 가까운 제곱입니다. IFFT 부분에서 8192 주파수 도메인 데이터를 다시 시간 도메인의 5000 길이 데이터로 변환합니다. 그래서 문제는 왜이 것이 컨볼 루션에서 작동하지만 FFT 곱셈에서는 작동하지 않습니다. 주파수 도메인에서 6 탭 (h) (n)을 8192 탭으로 변환하면이 문제가 발생합니까?FFT 길이가 필터링 정확도에 영향을 줍니까?

사실 나는 x (n)의 작은 덩어리로 FFT와 곱셈을 수행하고 별도로 5 번 수행하는 overlap-save 방법을 사용해 보았습니다. 결과는 이전보다 약간 좋아 보이지만 적어도 파형 패턴을 볼 수는 있지만 여전히 약간 왜곡되어 있습니다. 그래서, 어떤 생각이 잘못되었는지, 그리고 해결책은 무엇입니까. 고맙습니다.

시간 도메인 대신 주파수 도메인에서 순환 컨볼 루션을 구현하는 이유는 Lagrange 필터를 주파수 도메인의 다른 로우 패스 필터와 병합하여 구현이 더욱 효율적으로 이루어 지도록하려고하기 때문입니다. 물론 주파수 영역에서의 필터링 구현은 시간 영역에서의 회선보다 훨씬 빠르다고 믿습니다. LP 필터는 시간 영역에서 120 개의 탭을 갖는다. 메모리 제약으로 인해 패딩을 포함하는 원시 데이터 길이가 1024로 제한되므로 fft 빈도 제한됩니다.

내 Lagrange 계수에는 탭이 6 개 밖에 없으므로 1024 탭과 크게 다릅니다. 주파수 도메인에서 1024 개의 bin으로 6 회 탭 중 fft가 오류를 일으킬 것입니다. 다음은 Lagrange 필터에 대한 내 matlab 코드입니다. 이것은 테스트 코드 일 뿐이며 구현 코드가 아닙니다. 좀 지저분 해, 미안해. 이 문제에 대한 조언을 더 많이 주시면 감사하겠습니다. 고맙습니다.

t=1:5000; 
fs=2.5*(10^12); 
A=70000; 

x=A*sin(2*pi*10.*t.*(10^6).*t./fs); 

delay=0.4; 
N=5; 

n = 0:N; 
h = ones(1,N+1); 

for k = 0:N 
     index = find(n ~= k); 
     h(index) = h(index) * (delay-k)./ (n(index)-k); 
end 

pad=zeros(1,length(h)-1); 
out=[]; 
H=fft(hh,1024); 
H=fft([h zeros(1,1024-length(h))]); 
for i=0:1:ceil(length(x)/(1024-length(h)+1))-1 

    if (i ~= ceil(length(x)/(1024-length(h)+1))-1) 
     a=x(1,i*(1024-length(h)+1)+1:(i+1)*(1024-length(h)+1)); 
    else 
     temp=x(1,i*(1024-length(h)+1)+1:length(x)); 
     a=[temp zeros(1,1024-length(h)+1-length(temp))]; 
    end 

    xx=[pad a]; 
    X=fft(xx,1024); 


    Y=H.*X; 
    y=abs(ifft(Y,1024)); 
    out=[out y(1,length(h):length(y))]; 
    pad=y(1,length(a)+1:length(y)); 

end 
+0

설명을 통해 처음 시도한 기법이 효과가있었습니다. 코드를 게시하고 결과가 잘못되었다고 생각하는 이유는 무엇입니까? 또한, 6- 탭 FIR 필터의 경우, 오버랩 - 세이브 프로세싱에서 이점이별로 없다. 그러나 예를보고 싶다면 두 번째 코드 블록이 여기에 흥미가 있습니다. http://stackoverflow.com/questions/2929401/dsp-filtering-in-the-frequency-domain-via-fft/2949227#2949227 – mtrw

+0

'hh'와'x'가 정의되지 않았기 때문에 코드가 실행되지 않습니다. – mtrw

답변

0

일부 의견 :

  1. 두 가지의 가장 가까운 전원이 실제로 4096 당신이 나머지 904 개 샘플을 많이 기여할 것으로 기대합니까? 나는 당신이 상대적으로 저주파 특성을 찾고있을 때만 중요하다고 생각할 것입니다.
  2. 8192 개의 샘플에 신호를 어떻게 패딩 했습니까? 샘플을 8192로 채우는 것은 데이터의 약 40 %가 "가상의"것을 의미합니다. 데이터 세트를 길게하기 위해 0을 사용했다면, 패드 포인트에서 단계 변경을 주입했을 가능성이 높습니다. 이는 고주파수 컨텐츠를 많이 의미합니다.
  3. 방법을 보여주는 짧은 코드 스 니펫은 해를 끼칠 수 없습니다.
+0

저는 FFTW (MATLAB 내부적으로 사용하는)에서의 구현과 같은 현대적인 방법이 이제 2의 거듭 제곱이 아닌 길이를 효율적으로 처리 할 수있을 때 왜 OP가 패드의 필요성을 느끼는지 궁금합니다. –

+0

FFT/IFFT를 필터링하려면 순환 곱셈의 등가성을 주파수에서의 곱셈과 함께 사용하면되므로 순환 회선에서 랩 어라운드를 방지 할 수 있습니다. 당신은 스펙트럼 계수를 보지 않을 것입니다, 당신은 단지 그것들을 빠른 수학에 사용하고 있습니다. – mtrw

관련 문제