임시 블로그 이름

Kaiser Window Matlab & C++ Code 본문

엔지니어링

Kaiser Window Matlab & C++ Code

paeton 2015. 3. 4. 22:00


http://en.wikipedia.org/wiki/Kaiser_window



Window Function은 종류도 많고, 다양한 경우에 쓰인다. 특히 Apodization등에 써서 주파수 축에서 Side Lobe를 줄이는데 많이 사용 된다.

가장 유명한 Window Function은 아마 Hamming, Hanning 등 일텐데, 이러한 Window Function들은 따로 파라미터가 없이 고정되어있는 형태이다.

대신에 Kaiser Window는 파라미터로 윈도우의 형태를 조절할 수 있다.


특히 Window-Method Filter Design에서 유용하게 쓰이는데, 이 Kaiser Window를 적용하면, Transition Band나, Ripple등을 조절할 수 있기 때문이다.



Kaiser Window는 다음과 같이 정의 된다.


$*$w\left[ n \right] =\frac { { I }_{ 0 }\left( \pi \alpha \sqrt { 1-{ \left( \frac { 2n }{ N-1 } -1 \right)  }^{ 2 } }  \right)  }{ { I }_{ 0 }\left( \pi \alpha  \right)  } ,\quad \quad \quad \quad 0\le n\le N-1$*$


여기서 $*${ I }_{ 0 }\left( x \right) $*$는 Zeroth order modified bessel function of the first kind이다.


이전 포스트에서 구현한 Modified Bessel function of the first kind 코드를 이용하면 쉽게 구현할 수 있다.



  • Matlab
	
function w = kaiser(alpha,x,N)


b = pi*alpha*sqrt( 1 - (2*x/(N-1) - 1)^2 );

w = mbesseli0(b) / mbesseli0(pi*alpha); 
	


  • C++

// // Created by Jihan Kim (n37jan@gmail.com) on 2015. 3. 4. // This code is covered by BSD License. // #include <cstdio> #include <cmath> #include <iostream> const int MaxIter = 200; int factorial(int n) { if( n == 0) { return 1; } int val = 1; for( int idx = 1; idx <=n; ++idx) { val *= idx; } return val; } float mbesseli0(float x) { float sum = 0.0F; for(int m = 0; m < MaxIter; ++m) { int factM = factorial(m); // m! float inc = powf(1.0F/factM * powf(x * 0.5F, m), 2); // ( 1/(m!) * (x/2)^m )^2 float frac = inc / sum; sum += inc; if( frac < 0.001F) { break; } } return sum; } float kaiserWindow(float alpha, float x, int N) { float b = (float)M_PI * alpha * sqrtf( 1.0F - powf( 2.0F*x/(N-1.0F) - 1.0F, 2.0F )); float w = mbesseli0(b) / mbesseli0( (float)M_PI * alpha); return w; }


Comments