我目前正试图弄清楚如何在C ++中实现MATLAB的hilbert()
函数的等效版本。我对信号处理非常陌生,但最终,我想找出一种方法将任何给定信号相移90度。我试图遵循this question on MATLAB central中建议的方法,该方法似乎基于使用GNU Octave的测试工作。
我有我认为是FFT和逆FFT的工作实现,我尝试实现this post的答案中描述的方法,以便计算分析信号。我尝试过这样做,通过应用FFT,将数组的上半部分设置为零,然后应用逆FFT,但是,根据我对测试输出的图表,我必须有一个问题实现了分析信号。
考虑到FFT和逆FFT的工作实现,在C ++中用MATLAB实现hilbert()
函数的合适方法是什么?有没有更好的方法来实现90度相移?
答案 0 :(得分:2)
检查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:修正了一个逻辑错误。我在MATLAB中编写了与hilbert相匹配的后续内容。
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