주요 콘텐츠

fftfilt

overlap-add 방법을 사용하는 FFT 기반 FIR 필터링

설명

y = fftfilt(b,x)는 벡터 x에 지정된 데이터를 필터링합니다. 이 함수는 계수 벡터 b로 표현되는 필터를 사용합니다.

예제

y = fftfilt(b,x,nfft)nfft를 사용하여 FFT의 길이를 결정합니다.

예제

y = fftfilt(d,x)는 벡터 x의 데이터를 digitalFilter 객체 d를 사용하여 필터링합니다.

y = fftfilt(d,x,nfft)nfft를 사용하여 FFT의 길이를 결정합니다.

예제

모두 축소

filter는 피연산자가 작을수록 더 효율적이고 fftfilt는 피연산자가 큰 경우 더 효율적임을 확인해 보겠습니다. 임의의 두 개 필터(탭이 20인 짧은 필터와 2000인 긴 필터)로 106개의 난수를 필터링합니다. tictoc을 사용하여 실행 시간을 측정합니다. 보다 정확한 통계 결과를 얻도록 실험을 100번 반복합니다.

rng("default")

N = 100;

s = 20;
l = 2000;

tfs = 0;
tls = 0;
tfl = 0;
tll = 0;

for kj = 1:N
    
    x = rand(1,1e6);

    bshrt = rand(1,s);

    tic
    sfs = fftfilt(bshrt,x);
    tfs = tfs+toc/N;

    tic
    sls = filter(bshrt,1,x);
    tls = tls+toc/N;

    blong = rand(1,l);

    tic
    sfl = fftfilt(blong,x);
    tfl = tfl+toc/N;
    
    tic
    sll = filter(blong,1,x);
    tll = tll+toc/N;

end

평균 시간을 비교하고 표시합니다.

table(table(1000*[tfs;tls],1000*[tfl;tll], ...
    RowNames=["fftfilt" "filter"],VariableNames=[s;l]+"-tap"), ...
    VariableNames="Filter averages (milliseconds)")
ans=2×1 table
            Filter averages (milliseconds)        
    ______________________________________________

               20-tap    2000-tap
               ______    ________
                                                  
    fftfilt    69.54      32.026 
    filter     5.505      74.574 

이 예제를 수행하려면 Parallel Computing Toolbox™가 필요합니다. 지원되는 GPU 목록은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오.

가산성 백색 가우스 잡음(AWGN)이 있는 사인파의 합으로 구성된 신호를 생성합니다. 사인파 주파수는 2.5kHz, 5kHz, 10kHz, 15kHz입니다. 샘플링 주파수는 50kHz입니다.

Fs = 50e3;
t = 0:1/Fs:10-(1/Fs);
x = cos(2*pi*2500*t) + ...
    0.5*sin(2*pi*5000*t) + ...
    0.25*cos(2*pi*10000*t)+ ...
    0.125*sin(2*pi*15000*t) + randn(size(t));

designfilt를 사용하여 저역통과 FIR 등리플 필터를 설계합니다.

d = designfilt("lowpassfir",SampleRate=Fs, ...
    PassbandFrequency=5500,StopbandFrequency=6000, ...
    PassbandRipple=0.5,StopbandAttenuation=50);
B = d.Numerator;

overlap-add 방법을 사용하여 GPU의 데이터를 필터링합니다. gpuArray를 사용하여 GPU에 데이터를 입력합니다. gather를 사용하여 MATLAB® 작업 공간으로 출력값을 반환하고, 필터링된 데이터의 파워 스펙트럼 밀도 추정값을 플로팅합니다.

y = fftfilt(gpuArray(B),gpuArray(x));
periodogram(gather(y),rectwin(length(y)),length(y),50e3)

Figure contains an axes object. The axes object with title Periodogram Power Spectral Density Estimate, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains an object of type line.

입력 인수

모두 축소

필터 계수로, 벡터로 지정됩니다. b가 행렬이면 fftfiltb의 각 열에 있는 필터를 신호 벡터 x에 적용합니다.

입력 데이터로, 벡터로 지정됩니다. x가 행렬이면 fftfilt는 이 행렬의 열을 필터링합니다. bx가 둘 다 행렬이고 열 개수가 같으면, bi번째 열을 사용하여 xi번째 열을 필터링합니다. fftfilt는 실수 입력값과 복소수 입력값 모두에 사용할 수 있습니다.

FFT 길이로, 필터 길이보다 크거나 같은 2의 거듭제곱인 양의 정수로 지정됩니다.

  • 기본적으로 fftfilt는 효율적인 실행 시간을 보장하는 데이터 블록 길이와 FFT 길이를 선택합니다.

  • nfft를 2의 거듭제곱인 양의 정수로 지정하지 않거나 nfft가 필터 길이보다 작은 경우 fftfilt 함수는 FFT 길이로 2^nextpow2(max(nfft,N))을 선택합니다. 여기서 N은 필터 길이입니다.

    • b가 벡터이면 N = numel(b)입니다.

    • b가 행렬이면 N = size(b,1)입니다.

디지털 필터로, digitalFilter 객체로 지정됩니다. designfilt를 사용하여 주파수-응답 사양을 기반으로 d를 생성합니다.

출력 인수

모두 축소

출력 데이터로, 벡터 또는 행렬로 반환됩니다.

세부 정보

모두 축소

알고리즘

fftfilt는 효율적인 FFT 기반 overlap-add[1] 방법을 사용하여 데이터를 필터링합니다. 이 방법은 주파수 영역에서 필터링된 입력 시퀀스의 연속적인 블록을 재조합하는 기법이며 FIR 필터에만 사용할 수 있습니다.

Nx개 요소를 가진 입력 신호 벡터 xN개 요소를 가진 필터 벡터 b가 있다고 가정해 보겠습니다. 여기서 b = [b1 b2bN]입니다. fftfilt에 의해 수행되는 연산은 시간 영역에서 다음과 같은 차분 방정식으로 표현됩니다.

y[n]=b1x[n]+b2x[n1]++bNx[n(N1)]

동일한 표현으로 Z 변환 또는 주파수 영역 표현이 있습니다.

Y(z)=[b1+b2z1++bNz(N1)]X(z)

fftfilt 함수는 fft를 사용하여 overlap-add 방법을 구현합니다. fftfilt 함수는 입력 시퀀스 x를 길이가 Lk개 데이터 블록으로 나눕니다. 여기서 L은 필터 길이 N보다 커야 하고, k = ⌈Nx/L이며, ⌈⌉ 기호는 천장 함수(Ceiling function)를 나타냅니다.

이 함수는 다음을 통해 필터 b를 사용하여 각 블록을 컨벌루션합니다.

y = ifft(fft(x(i:i+L-1),nfft).*fft(b,nfft));

여기서 i = 1, L+1, 2L+1, ⋯이고 nfft는 FFT 길이입니다. fftfilt는 연속된 출력 섹션들을 N–1개 점만큼 중첩하고 이들을 더합니다.

fftfilt는 사용자가 필터 및 신호에 대해 FFT 길이 nfft를 지정하는지 여부에 따라 주요 파라미터인 Lnfft를 다양한 방법으로 선택합니다.

  • FFT 길이를 결정하는 nfft의 값을 지정하지 않을 경우, fftfilt는 자동으로 다음 주요 파라미터를 선택합니다.

    • length(x)length(b)보다 크면, fftfilt는 블록 개수와 FFT별 플롭스 수를 곱한 값을 최소화하는 값을 선택합니다.

    • length(b)length(x)보다 크거나 같으면 fftfilt2^nextpow2(length(b) + length(x) - 1) 길이를 갖는 단일 FFT를 사용합니다.

      이러한 가정을 통해 y가 다음과 같이 생성됩니다.

      y = ifft(fft(b,nfft).*fft(x,nfft))
      

  • nfft의 값을 지정할 경우, fftfilt2^nextpow2(nfft)의 FFT 길이와 nfft-length(b)+1의 데이터 블록 길이를 선택합니다. nfftlength(b)보다 작으면 fftfilt는 FFT 길이로 2^nextpow(length(b))를 선택합니다.

참고 문헌

[1] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.

확장 기능

모두 확장

버전 내역

R2006a 이전에 개발됨