Wigner Ville Distribution

1 개요

1D 이미지에 Wigner Ville Distribution 을 수행하는 알고리즘입니다.

2 알고리즘 상세 설명

일차적으로 소스 이미지 x(t) 를 아날리틱(analytic) 신호로 변환합니다.
입력 받은 Self Correlation Half Length(L) 을 기반으로, 각 픽셀을 중심으로 한 tau = [-L, L] 범위의 self correlation 을 계산합니다. L 값이 클수록 주파수 해상도가 올라가지만 시간 분해능은 감소하는 트레이드 오프 관계에 있습니다.
이렇게 얻어진 2D 이미지에 대하여 tau 축을 따라 Window 적용 및 FFT 를 수행함으로써, 시간 정보가 내재된 주파수 정보를 추출합니다.
Output Mode 설정을 통해 2채널 복소수 또는 1채널 L2 Norm 으로 출력 모드 설정이 가능하며, Output Direction 으로 출력 이미지 상 시간 축(소스 이미지 x 축에 대응)의 방향 또한 Horizontal 및 Vertical 로 설정 할 수 있습니다.
FFT 수행 시, frequency domain 에서 radix 가 과도하게 크지 않은 최적의 길이로 증가될 수 있으며, 따라서 2*L + 1 이상의 주파수 축 길이를 가집니다.

Source Wave Plot Destination Image
Source Wave Plot Shift Image
Fig. Chirp 신호의 Wigner Ville Distribution 실행 결과

3 파라미터 설정 및 사용 방법

멤버함수 파라미터 설 명
SetScale double f64Scale IN 소스 데이터에 적용 될 Scale 값
해당 값을 통해 WVD 출력의 수치를 조절할 수 있습니다.
`f64Scale` - **Default Value**: 1.0
멤버함수 파라미터 설 명
SetSelfCorrelationHalfSize int64_t i64SelfCorrelationHalfSize IN self correlation half size 값
self correlation 시 수행 할 tau 의 범위를 설정합니다. 해당 값이 L 일 때, tau = [-L, L] 의 2*L+1 길이 구간을 가집니다. 이 길이가 길수록 주파수 해상도가 높아지지만 시간 분해능은 낮아집니다.
`i64SelfCorrelationHalfSize` - **Default Value**: 1
멤버함수 파라미터 설 명
SetSelfCorrelationWindow CWignerVilleDistribution::ESelfCorrelationWindow eSelfCorrelationWindow IN self correlation window 값
self correlation 값의 tau 축에 취할 window 종류를 설정합니다.
- None (rectangle)
- Hann (a0 = 0.5, a1 = 0.5)
- Hamming (a0 = 0.53836, a1 = 0.46164)
- Blackman (a0 = 0.42659, a1 = 0.49656, a2 = 0.076849)
- BlackmanNuttall (a0 = 0.3635819, a1 = 0.4891775, a2 = 0.1365995, a3 = 0.0106411)
- BlackmanHarris (a0 = 0.35875, a1 = 0.48829, a2 = 0.14128, a3 = 0.01168)
- Gaussian (sigma used)

`eSelfCorrelationWindow` - **Default Value**: CWignerVilleDistribution::ESelfCorrelationWindow_None
멤버함수 파라미터 설 명
SetSigma double f64Sigma IN Gaussian window 의 Sigma 값
Gaussian window 의 sigma 값을 설정합니다.
`f64Sigma` - **Default Value**: 0.1, (0, 0.5]
멤버함수 파라미터 설 명
SetOutputMode CWignerVilleDistribution::EOutputMode eOutputMode IN output mode 값
출력 방식을 결정 할 output mode 를 설정합니다.
- L2Norm
- Complex

`eOutputMode` - **Default Value**: CWignerVilleDistribution::EOutputMode_L2Norm
멤버함수 파라미터 설 명
SetOutputDirection CWignerVilleDistribution::EOutputDirection eOutputDirection IN output direction 값
출력 방향을 결정 할 output direction 을 설정합니다.
- Horizontal
- Vertical

`eOutputDirection` - **Default Value**: CWignerVilleDistribution::EOutputDirection_Horizontal

4 예제 코드

CWignerVilleDistribution wvd;
 
if((res = wvd.SetSourceImage(fliISrcImage)).IsFail())
    break;
if((res = wvd.SetDestinationImage(fliIDstImage)).IsFail())
    break;
if((res = wvd.SetScale(0.00004)).IsFail())
    break;
if((res = wvd.SetSelfCorrelationHalfSize(511)).IsFail())
    break;
if((res = wvd.SetSelfCorrelationWindow(CWignerVilleDistribution::ESelfCorrelationWindow_Gaussian)).IsFail())
    break;
if((res = wvd.SetSigma(0.3)).IsFail())
    break;
if((res = wvd.SetOutputMode(CWignerVilleDistribution::EOutputMode_L2Norm)).IsFail())
    break;
if((res = wvd.SetOutputDirection(CWignerVilleDistribution::EOutputDirection_Horizontal)).IsFail())
    break;

if((res = wvd.Execute()).IsFail())
    break;
CWignerVilleDistribution wvd = new CWignerVilleDistribution();

if((res = wvd.SetSourceImage(ref fliISrcImage)).IsFail())
    break;
if((res = wvd.SetDestinationImage(ref fliIDstImage)).IsFail())
    break;
if((res = wvd.SetScale(0.00004)).IsFail())
    break;
if((res = wvd.SetSelfCorrelationHalfSize(511)).IsFail())
    break;
if((res = wvd.SetSelfCorrelationWindow(CWignerVilleDistribution.ESelfCorrelationWindow.Gaussian)).IsFail())
    break;
if((res = wvd.SetSigma(0.3)).IsFail())
    break;
if((res = wvd.SetOutputMode(CWignerVilleDistribution.EOutputMode.L2Norm)).IsFail())
    break;
if((res = wvd.SetOutputDirection(CWignerVilleDistribution.EOutputDirection.Horizontal)).IsFail())
    break;
    
if((res = (wvd.Execute())).IsFail())
    break;