在C+中使用FFT计算分析信号+; 我现在正在试图找出如何在C++中实现Matlab的代码“代码> HiBurt())/Cuff>函数的等价版本。我对信号处理非常陌生,但最终,我想找出一种方法,将任何给定信号相移90度。我试图遵循中建议的方法,该方法基于使用GNU倍频程的测试

在C+中使用FFT计算分析信号+; 我现在正在试图找出如何在C++中实现Matlab的代码“代码> HiBurt())/Cuff>函数的等价版本。我对信号处理非常陌生,但最终,我想找出一种方法,将任何给定信号相移90度。我试图遵循中建议的方法,该方法基于使用GNU倍频程的测试,c++,matlab,signal-processing,fft,C++,Matlab,Signal Processing,Fft,我有一个我认为是FFT和逆FFT的工作实现,并且我已经尝试实现了答案中描述的方法,以便计算分析信号。我曾尝试通过应用FFT来实现这一点,将数组的上半部分设置为零,然后应用逆FFT,但是,根据我对测试输出的图形,我实现查找分析信号的方式肯定存在问题 如果C++实现了FFT和逆FFT的工作实现,那么从C++中实现代码< >希伯特()/Cuff>函数的方法是什么?是否有更好的方法实现90度相移?检查MATLAB实现时,以下应返回与hilbert函数相同的结果。显然,您必须修改它以匹配您的特定实现。我假

我有一个我认为是FFT和逆FFT的工作实现,并且我已经尝试实现了答案中描述的方法,以便计算分析信号。我曾尝试通过应用FFT来实现这一点,将数组的上半部分设置为零,然后应用逆FFT,但是,根据我对测试输出的图形,我实现查找分析信号的方式肯定存在问题


如果C++实现了FFT和逆FFT的工作实现,那么从C++中实现代码< >希伯特()/Cuff>函数的方法是什么?是否有更好的方法实现90度相移?

检查MATLAB实现时,以下应返回与
hilbert
函数相同的结果。显然,您必须修改它以匹配您的特定实现。我假设存在某种类型的
信号

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

检查MATLAB实现时,以下结果应与
hilbert
函数返回的结果相同。显然,您必须修改它以匹配您的特定实现。我假设存在某种类型的
信号

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

我不确定MATLAB中的hilbert函数,但在FFT中给定复系数
a+I*b
,您可以通过将其替换为
-b+I*a
来执行90度相移。此外,如果您有MATLAB,您可以键入
编辑hilbert
,以查看它们使用的实现。一旦实现了FFT和逆FFT,它看起来非常简单。@jodag不幸的是,用
-b+i*a
替换
a+i*b
似乎没有达到预期的效果。也许我使用的FFT或逆FFT的实现是错误的?在应用FFT之前,我实际上从中得到了相同的数据。还有,我没有MATLAB。是的,它看起来有点不同。我会仔细看一下,然后再告诉你,你真的一直在说“FTT”吗,还是这是一个“FFT”的后续类型?我不确定MATLAB中的希尔伯特函数,但如果FFT中的复系数
a+I*b
,你也可以通过用
-b+I*a
替换它来执行90度相移,如果你有MATLAB,你可以键入
编辑hilbert
,查看他们使用的实现。一旦实现了FFT和逆FFT,它看起来非常简单。@jodag不幸的是,用
-b+i*a
替换
a+i*b
似乎没有达到预期的效果。也许我使用的FFT或逆FFT的实现是错误的?在应用FFT之前,我实际上从中得到了相同的数据。还有,我没有MATLAB。是的,它看起来有点不同。我会仔细看一遍,然后再告诉你,你真的一直在说“FTT”吗,还是说这是一个“FFT”的后续输入错误?这是如何做到的:在Matlab中用C风格实现算法,检查你得到的答案是否与内置函数相同,然后将它移植到实际的C(或Rust或其他)。由于某种原因,在切换到使用FFTW后,我很难让它正常工作。有什么建议吗?如果您让它使用以前的FFT实现工作,那么您可能应该创建一个简单的案例,看看FFTW与以前的实现有何不同。MATLAB在后端使用FFTW,因此我相信您可以使用FFTW使其工作。方法如下:在MATLAB中以C风格实现算法,检查您得到的答案是否与内置函数相同,然后将其移植到实际的C(或Rust或其他)。由于某种原因,在切换到使用FFTW后,我很难让它正常工作。有什么建议吗?如果您让它使用以前的FFT实现工作,那么您可能应该创建一个简单的案例,看看FFTW与以前的实现有何不同。MATLAB在后端使用FFTW,因此我相信您可以使用FFTW使其正常工作。