繁体   English   中英

在C ++中使用FFT计算分析信号

[英]Computing analytical signal using FFT in C++

我现在迷失了试图弄清楚如何在C ++中实现等效版本的MATLAB的hilbert()函数。 我对信号处理非常陌生,但最终,我想找出一种将任何给定信号相移90度的方法。 我试图在MATLAB Central上遵循此问题中建议的方法, 方法似乎基于使用GNU Octave进行的测试有效。

我认为这是FFT和逆FFT的有效实现方式,并且我已尝试实现本帖子答案中描述的方法,以便计算分析信号。 我尝试通过应用FFT,将数组的上半部分设置为零,然后应用逆FFT来执行此操作,但是,基于我从测试输出中绘制的图形,我的方式一定存在问题实施查找分析信号。

给定FFT和逆FFT的有效实现,什么是从MATLAB hilbert() C ++实现hilbert()函数的合适方法? 有没有更好的方法来实现90度相移?

检查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);
}

编辑:忘记将后半部分设置为零。 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM