일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- image processing
- Bessel Funciton
- Knob Control
- c++
- User Control
- 신호처리
- lowpass filter
- 됬으면 좋겠네
- 이민
- 해외생활
- cudnn
- King County
- 차사기
- biosignal
- IT
- Visual Studio
- Signal Processing
- 미국 차 구매
- 이사쿠아
- 미국
- ecg
- 매틀랩
- Issaquah
- 영상처리
- Kaiser Window
- DSP
- 킹카운티
- Matlab
- covid19
- Window Function
- Today
- Total
임시 블로그 이름
Modified Bessel Function of the First Kind Matlab & C++ Code 본문
http://mathworld.wolfram.com/ModifiedBesselFunctionoftheFirstKind.html
여기에서 $*${n}$*$이 실수 $*${v}$*$인 경우엔 아래와 같이 계산할 수 있다.
$*${ I }_{ v }(z)={ \left( \cfrac { 1 }{ 2 } z \right) }^{ v }\sum _{ k=0 }^{ \infty }{ \frac { { \left( \cfrac { 1 }{ 2 } z \right) }^{ 2k } }{ k!\Gamma \left( v+k+1 \right) } } $*$
$*$\Gamma$*$는 gamma function이다.
여기에서 다시 $*${v}$*$가 정수라 하면 다음과 같이 정리할 수 있다.
$*${ I }_{ v }(z)={ \left( \cfrac { 1 }{ 2 } z \right) }^{ v }\sum _{ k=0 }^{ \infty }{ \frac { { \left( \cfrac { 1 }{ 2 } z \right) }^{ 2k } }{ k!(k+v)! } } $*$
간단히 $*${v}=0$*$라 하면 아래와 같으며, 이것은 Kaiser Window를 생성할때 사용하는 Zeroth Order Modified Bessel Function이다.
$*${ I }_{ 0 }(z)=\sum _{ k=0 }^{ \infty }{ { \left( \frac { { \left( \cfrac { 1 }{ 2 } z \right) }^{ k } }{ k! } \right) }^{ 2 } } $*$
Matlab 코드로 구현하려면 생각해 보아야 할 것이. 일단 저 함수는 시그마에 무한대 기호가 붙어있다.
따라서 실제로 코드로 구현하려면, 적당한 조건을 주어서 유한한 연산이 되도록 해 주어야 한다.
먼저 최대 몇번째 항 까지 쓸지 정해야 한다. 코드에 Maximum Iteration이라고 되어있고, 이것에 따라서 for-loop연산을 하게 되어있다.
이것을 정해줌으로 해서, 적어도 이 함수가 200번 연산을 하고는 끝난다는것을 보장할 수 있다.
둘째로는 각 항을 더해감에 따라 $*$k!$*$에 의해서 값이 줄어드는데, 최종 결과에 영향을 미치지 않을 만큼 충분히 작은 값이 되면 더이상 더하지 않는것이다.
이미 더해진 값을 sum이라 하고, 현재 계산된 항의 값을 inc라 했을 때, inc가 sum의 0.1% 보다 작아지면 멈춘다.
- Matlab Code
function sum = besseli0(x)
M = 200; % maximum interation
sum = 0;
for m = 0 : (M-1)
factm = factorial(m); % m!
inc = (1/factm*(x*0.5)^m)^2; % (1/(m!) * (x/2)^m)^2
frac = inc/sum; % increment ratio
sum = sum + inc;
if( frac <0.001) % if the increment ratio is less than 0.1% then break
break;
end
end
function val = factorial(m)
if( m == 0 )
val = 1;
return;
end
val = 1;
for idx = 2 : m
val = val*idx;
end
- C++ Code
'엔지니어링' 카테고리의 다른 글
Frequency Sampling FIR Filter Design (0) | 2015.03.07 |
---|---|
Kaiser Window Matlab & C++ Code (0) | 2015.03.04 |
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 |
ECG 신호처리 (2) (0) | 2012.12.20 |