2016-08-19 2 views
0

현재 C++에서 해당하는 버전의 MATLAB hilbert()을 구현하는 방법을 찾지 못했습니다. 저는 신호 처리에있어 매우 새로운 것이지만, 궁극적으로 주어진 신호를 90도 위상 변이시키는 방법을 찾아 내고 싶습니다. 나는 this question on MATLAB central에서 제안 된 방법을 따르려고했는데, 이것은 GNU Octave를 사용하는 테스트를 기반으로 작동하는 것으로 보입니다.C++에서 FFT를 사용하여 분석 신호 계산

나는 FFT와 역 FFT의 작동 구현이라고 생각하며 분석 신호를 계산하기 위해 this post에 대한 대답에서 설명한 방법을 구현하려고 시도했습니다. 나는 FFT를 적용하여 배열의 상반부를 0으로 설정 한 다음 역 FFT를 적용하여이 작업을 시도했지만, 테스트 결과를 그래프로 만들었 기 때문에 내가 갖고있는 방식에 문제가 있어야합니다. 분석 신호를 찾는 작업을 구현했습니다.

FFT 및 역 FFT의 작동 구현이 주어진 C++의 MATLAB에서 hilbert() 함수를 구현하는 적절한 방법은 무엇입니까? 90도 위상 이동을 달성하는 더 좋은 방법이 있습니까?

+0

내가 MATLAB에서 힐버트 기능 확실하지만 난 b'를 * A +'당신의 FFT 복잡한 계수 주어진 아니에요, 당신은 + 내가 * -b '로 교체하여 90도 위상 변화를 수행 할 수 있습니다 a – jodag

+1

또한, MATLAB을 사용하고 있다면'edit hilbert'를 입력하여 그들이 사용하는 구현을 볼 수 있습니다. FFT와 역 FFT를 구현하면 꽤 똑바로 보입니다. – jodag

+0

@jodag 불행히도'a + i * b'를'-b + i * a'로 바꾸는 것은 원하는 효과를 내지 못하는 것 같습니다. 어쩌면 사용하고있는 FFT 또는 역 FFT의 구현이 잘못 되었습니까? 사실 FFT를 적용하기 전에 동일한 데이터를 다시 얻고 있습니다. 또한 MATLAB이 없습니다. – fakedad

답변

3

MATLAB 구현을 확인하면 다음과 같은 결과가 hilbert 함수와 함께 반환됩니다. 분명히 특정 구현에 맞게 수정해야합니다. 나는 어떤 종류의 signal 클래스가 있다고 가정하고있다.

signal hilbert(const signal &x) 
{ 
    int limit1, limit2; 
    signal xfreq = fft(x); 
    if (x.numel % 2 == 0) { 
     limit1 = x.numel/2; 
     limit2 = limit1 + 1; 
    } else { 
     limit1 = (x.numel + 1)/2; 
     limit2 = limit1; 
    } 
    // multiply the first half by 2 (except the first element) 
    for (int i = 1; i < limit1; ++i) { 
     xfreq[i].real *= 2; 
     xfreq[i].imag *= 2; 
    } 
    for (int i = limit2; i < x.numel; ++i) { 
     xfreq[i].real = 0; 
     xfreq[i].imag = 0; 
    } 
    return ifft(xfreq); 
} 

편집 : 두 번째 절반을 0으로 설정하는 것을 잊어 버렸습니다. Edit2 : 논리적 오류가 수정되었습니다. 필자는 hilbert와 일치하는 MATLAB에서 다음 코드를 코딩했습니다.

function h = hil(x) 
    n = numel(x); 
    if (mod(n,2) == 0) 
     limit1 = n/2; 
     limit2 = limit1 + 2; 
    else 
     limit1 = (n+1)/2; 
     limit2 = limit1+1; 
    end 

    xfreq = fft(x); 

    for i = 2:limit1 
     xfreq(i) = xfreq(i)*2; 
    end 
    for i = limit2:n 
     xfreq(i) = 0; 
    end 

    h = ifft(xfreq); 
end 
+4

다음과 같이하십시오 : Matlab의 C 스타일로 알고리즘을 구현하고 내장 함수와 동일한 대답을 얻었는지 확인한 다음 실제 C (또는 녹 또는 기타)로 포트하십시오. –

+0

FFTW를 사용하도록 전환 한 후 어떤 이유로이 작업을 수행하는 데 문제가 있습니다. 어떤 제안? – fakedad

+0

이전 FFT 구현을 사용하여 작업했다면 간단한 사례를 만들고 FFTW가 이전 구현과 다른 점을 확인해야합니다. MATLAB은 백 엔드에서 FFTW를 사용하므로 FFTW를 사용하여 작업하게 만들 수 있습니다. – jodag