在c++中使用FFT计算分析信号
Computing analytical signal using FFT in C++
我目前正在试图弄清楚如何在c++中实现MATLAB的hilbert()
函数的等效版本。我对信号处理很陌生,但是,最终,我想找到一种方法,使任何给定的信号相移90度。我试图在MATLAB central上遵循这个问题中建议的方法,这似乎是基于使用GNU Octave的测试。
我有我认为是FFT和逆FFT的工作实现,我已经尝试实现这篇文章的答案中描述的方法,以计算分析信号。我尝试通过应用FFT,将数组的上半部分设置为零,然后应用逆FFT来做到这一点,但是,根据我从测试输出的图形,我实现找到分析信号的方式一定存在问题。
给出FFT和逆FFT的工作实现,在c++中实现MATLAB 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);
}
编辑:忘记把后半部分设置为0了。修正了一个逻辑错误。我在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
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- Qt VTK交互风格的信号到小部件
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- FFTW3 计算同一信号中的互相关
- 计算信号量还是互斥体?
- PPG信号的锤窗口和阈值计算
- 计算正弦信号的频率,c++
- 在c++中使用FFT计算分析信号
- 信号处理-计算FFT和IFFT用FFTW库c++