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

fftfilt

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

구문

y = fftfilt(b,x)
y = fftfilt(b,x,n)
y = fftfilt(d,x)
y = fftfilt(d,x,n)
y = fftfilt(gpuArrayb,gpuArrayX,n)

설명

fftfilt는 효율적인 FFT 기반 중첩 가산 방법을 사용하여 데이터를 필터링합니다. 이 방법은 FIR 필터에만 사용할 수 있는 주파수 영역 필터링 기법입니다.

y = fftfilt(b,x)는 계수 벡터 b로 표현되는 필터를 사용하여 벡터 x의 데이터를 필터링합니다. 그러면 데이터 벡터 y가 반환됩니다. 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)

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

x가 행렬이면 fftfilt는 이 행렬의 열을 필터링합니다. b가 행렬이면 fftfiltb의 각 열에 있는 필터를 신호 벡터 x에 적용합니다. bx가 둘 다 행렬이고 열 개수가 같으면, b의 i번째 열을 사용하여 x의 i번째 열을 필터링합니다.

y = fftfilt(b,x,n)n을 사용하여 FFT의 길이를 결정합니다. 자세한 내용은 알고리즘 항목을 참조하십시오.

y = fftfilt(d,x)는 벡터 x의 데이터를 digitalFilter 객체 d를 사용하여 필터링합니다. designfilt를 사용하여 주파수-응답 사양을 기반으로 d를 생성합니다.

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

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

fftfilt는 실수 입력값과 복소수 입력값 모두에 사용할 수 있습니다.

filter 함수와의 비교

입력 신호가 비교적 큰 경우 x의 각 샘플에 N회 곱셈을 수행하는(여기서 N은 필터 길이임) filter 대신 fftfilt를 사용하는 것이 유리합니다. fftfilt는 FFT 연산을 두 번 수행하는데(길이가 L인 신호 블록에 대한 FFT와 FFT 곱에 대한 역 FT) 이 연산에 드는 비용은 다음과 같습니다.

½Llog2L

여기서 L은 블록 길이입니다. 그런 후 다음과 같이 L회 점별 곱셈을 수행합니다.

L + Llog2L = L(1 + log2L)

이것이 총 연산 비용입니다. 고로, 두 함수의 연산 비용 비율은 다음과 같습니다.

L(1+log2L) / (NL) = (1 + log2L)/N

이는 대략 log2L / N 정도에 해당합니다.

따라서, log2L이 N보다 작을 경우 fftfilt를 사용하는 것이 유리합니다.

예제

모두 축소

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.490031 s; filter: 0.021836 s
fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',long,tfl,tll)
2000-tap filter averages: fftfilt: 0.162858 s; filter: 0.322573 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)

알고리즘

fftfiltfft를 사용하여 중첩 가산 방법 [1](주파수 영역에서 필터링된 입력 시퀀스의 연속적인 블록을 재조합하는 기법)을 구현합니다. 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 이전에 개발됨