信号特征之希尔伯特变换(Python、C++、MATLAB实现)
warning:
这篇文章距离上次修改已过235天,其中的内容可能已经有所变动。
由于原始代码是针对信号处理中的特定问题设计的,我们需要提供一个更通用的示例,展示如何在Python、C++和MATLAB中实现希尔伯特变换。
Python示例:
import numpy as np
import scipy.fftpack as fftpack
def hilbert_transform(x, N=None, envelope=False):
"""
计算信号x的希尔伯特变换
:param x: 信号
:param N: FFT的大小,如果不提供,则取信号长度
:param envelope: 如果为True,仅返回幅度部分
:return: 希尔伯特变换后的信号
"""
if N is None:
N = len(x)
X = fftpack.hilbert(envelope, N=N)
return X[:(N//2)+1] * 2 / N # 使用两倍的幅度来匹配单边频谱
# 示例使用
import matplotlib.pyplot as plt
# 创建一个示例信号
t = np.linspace(0, 1, 1024)
x = np.cos(2*np.pi*100*t) + np.cos(2*np.pi*200*t)
# 计算希尔伯特变换
hilbert_x = hilbert_transform(x)
# 绘制结果
plt.subplot(2, 1, 1)
plt.plot(t, x)
plt.title('原始信号')
plt.subplot(2, 1, 2)
plt.plot(t, hilbert_x.real)
plt.title('希尔伯特变换后的实部')
plt.show()
C++示例:
#include <iostream>
#include <vector>
#include <cmath>
#include <fft.h> // 假设有一个实现了FFT的库
std::vector<double> hilbert_transform(const std::vector<double>& x) {
int N = x.size();
std::vector<fft_complex> X(N);
fft(x.data(), X.data(), N, 1); // 假设fft是一个实现FFT的函数
std::vector<double> hilbert_x(N);
for (int n = 0; n < N; n++) {
hilbert_x[n] = 2 * X[n].real() / N; // 使用两倍的幅度来匹配单边频谱
}
return hilbert_x;
}
int main() {
// 创建一个示例信号
int N = 1024;
std::vector<double> t(N);
std::vector<double> x(N);
for (int n = 0; n < N; n++) {
t[n] = n / double(N);
x[n] = cos(2 * M_PI * 100 * t[n]) + cos(2 * M_PI * 200 * t[n]);
}
// 计算希尔伯特变换
auto hilbert_x = hilbert_transform(x);
// 输出结果
for (int n = 0; n < N; n++) {
std::cout << "hilbert_x[" << n << "] = " << hilbert_x[n] << std::endl;
}
return 0;
}
MATLAB示例:
% 创建一个示例信号
N = 1024;
t = linspace(0, 1, N);
x = cos(2*pi*100*t) + cos(2*pi*200*t);
% 计算希尔伯特变换
hilbert_x = envelope(x
评论已关闭