Main Content

이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

fftfilt

중첩 가산 방법을 사용하는 FFT 기반 FIR 필터링

설명

예제

y = fftfilt(b,x)는 계수 벡터 b로 표현되는 필터를 사용하여 벡터 x의 데이터를 필터링합니다.

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

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

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

예제

y = fftfilt(gpuArrayb,gpuArrayX,n)gpuArray (Parallel Computing Toolbox) 객체 gpuArrayX의 데이터를 gpuArrayb에 저장된 gpuArray의 FIR 필터 계수를 사용하여 필터링합니다.

예제

모두 축소

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

rng default

N = 100;

shrt = 20;
long = 2000;

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

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

    bshrt = rand(1,shrt);

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

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

    blong = rand(1,long);

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

end

평균 시간을 비교합니다.

fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',shrt,tfs,tls)
  20-tap filter averages: fftfilt: 0.217872 s; filter: 0.006954 s
fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',long,tfl,tll)
2000-tap filter averages: fftfilt: 0.047552 s; filter: 0.096662 s

이 예제를 수행하려면 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.Coefficients;

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

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

입력 인수

모두 축소

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

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

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

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

GPU 배열로, gpuArray 객체로 지정됩니다. gpuArrayb는 필터 계수를 포함하고 gpuArrayX는 입력 데이터입니다. gpuArray 객체에 대한 자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오. fftfiltgpuArray 객체를 사용하려면 Parallel Computing Toolbox™가 필요합니다. 지원되는 GPU 목록은 릴리스별 GPU 지원 (Parallel Computing Toolbox)을 참조하십시오. 필터링된 데이터 ygpuArray 객체입니다. GPU에 중첩 가산 필터링을 적용하는 방법에 대한 예제는 GPU에서 중첩 가산 필터링 사용하기 항목을 참조하십시오.

출력 인수

모두 축소

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

세부 정보

모두 축소

filter 함수와의 비교

입력 신호가 비교적 크면 fftfiltfilter보다 빠릅니다.

filterx의 각 샘플에 N회 곱셈을 수행합니다. 여기서 N은 필터 길이입니다. fftfilt는 FFT 연산을 두 번 수행하는데(길이가 L인 신호 블록에 대한 FFT와 FFT 곱에 대한 역 FT) 이 연산에 드는 비용은 12Llog2L과 같습니다. 여기서 L은 블록 길이입니다. 그런 후 L+Llog2L=L(1+log2L) 곱셈의 총비용에 대해 다음과 같이 L회 점별 곱셈을 수행합니다. 따라서 비용 비율은 다음과 같습니다. L(1+log2L)/(NL)=(1+log2L)/N 이는 대략적으로 log2L / N과 비슷합니다.

따라서 log2L이 N보다 작을 경우 fftfilt가 더 빠릅니다.

알고리즘

fftfilt는 효율적인 FFT 기반 중첩 가산[1] 방법을 사용하여 데이터를 필터링합니다. 이 방법은 주파수 영역에서 필터링된 입력 시퀀스의 연속적인 블록을 재조합하는 기법이며 FIR 필터에만 사용할 수 있습니다. fftfilt에 의해 수행되는 연산은 시간 영역에서 다음과 같은 차분 방정식으로 표현됩니다.

y(n)=b(1)x(n)+b(2)x(n1)++b(nb+1)x(nnb)

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

Y(z)=(b(1)+b(2)z1++b(nb+1)znb)X(z)

fftfiltfft를 사용하여 중첩-가산 방법을 구현합니다. fftfilt는 입력 시퀀스 x를 길이가 L인 데이터 블록으로 나눕니다. 여기서 L은 필터 길이 N보다 커야 합니다.

그런 다음, 다음과 같이 필터 b를 사용하여 각 블록을 컨벌루션합니다.

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

여기서 nfft는 FFT 길이입니다. fftfilt는 연속 출력 섹션을 n-1개 점(n은 필터 길이)만큼 중첩하고 해당 섹션의 합을 구합니다.

fftfilt는 사용자가 필터 및 신호에 대해 FFT 길이 n을 지정하는지 여부에 따라 주요 파라미터인 Lnfft를 다양한 방법으로 선택합니다. FFT 길이를 결정하는 n의 값을 지정하지 않을 경우, fftfilt는 자동으로 다음 주요 파라미터를 선택합니다.

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

  • length(b)length(x)보다 크거나 같으면 fftfilt는 다음과 같은 길이를 갖는 단일 FFT를 사용합니다.

    2^nextpow2(length(b) + length(x) - 1)
    

    이는 다음을 계산합니다.

    y = ifft(fft(B,nfft).*fft(X,nfft))
    

n의 값을 제공할 경우, fftfilt2^nextpow2(n)의 FFT 길이 nfftnfft - length(b) + 1의 데이터 블록 길이를 선택합니다. nlength(b)보다 작으면, fftfiltnlength(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 이전에 개발됨