일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- c++
- ecg
- biosignal
- Bessel Funciton
- Kaiser Window
- covid19
- King County
- Issaquah
- 됬으면 좋겠네
- Signal Processing
- Knob Control
- 이사쿠아
- cudnn
- DSP
- 차사기
- 영상처리
- IT
- lowpass filter
- Visual Studio
- Matlab
- 미국
- User Control
- Window Function
- 킹카운티
- 매틀랩
- 이민
- image processing
- 해외생활
- 미국 차 구매
- 신호처리
- Today
- Total
임시 블로그 이름
Kaiser Window Matlab & C++ Code 본문
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; }
'엔지니어링' 카테고리의 다른 글
Window Function을 쓰는 이유 (24) | 2015.03.14 |
---|---|
Frequency Sampling FIR Filter Design (0) | 2015.03.07 |
Modified Bessel Function of the First Kind Matlab & C++ Code (0) | 2015.03.01 |
Multimodal Non-Rigid Motion Artifact Correction with Concurrent Ultrasound - Abstract (0) | 2014.10.14 |
Multimodal Non-Rigid Motion Artifact Correction with Concurrent Ultrasound - Poster (0) | 2014.10.14 |