hilbert算法的c语言实现,关于希尔伯特变换的 c语言实现

本文详细介绍了如何用C语言实现希尔伯特变换。通过离散傅里叶变换(DFT)和卷积的方法,计算出希尔伯特变换后的信号。首先定义复数结构体,然后实现DFT函数进行正反变换。在主函数中,经过两次DFT操作,最终得到希尔伯特变换后的信号。
摘要由CSDN通过智能技术生成

最近毕设需要用到希尔伯特变换的知识,今天做完之后决定还是记录下思路。

当然是数字信号的希尔伯特变换

89797816_1.jpg

上面是连续信号的希尔伯特变换,离散的应该也能根据上面写(没现成的图片,懒得编辑公式了)。

这里打算采用使用卷积的方法来计算。由于希尔伯特变换的传输函数的傅里叶变换是  H(w)=        -j   w>=0

j     w<0

所以我们可以先求原始信号的离散傅里叶变换E(K),然后按照下面的公式就可以求出希尔伯特变换之后的信号的离散傅里叶变换Eh(K)。

然后对Eh(K)求反傅里叶变换就可得到我们需要的信号的希尔伯特变换信号。

下面贴代码思路

先建立一个复信号的结构体:

typedef struct {

Float64 r;  /* 实部 */

Float64 i;  /* 虚部 */

} CPX;

接着是离散傅里叶变换的函数  第一个参数dir代表正变换和反变换。

void DFT(int dir,int framelen,CPX *signal,CPX *dft_s)

{

int i,k;

double arg;

double cosarg,sinarg;

for(i=0;i

{

arg=-dir*2.0*3.141592654*(double)i/(double)framelen;

for(k

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
希尔伯特变换Hilbert Transform)可以通过快速傅里叶变换(FFT)实现,其C语言实现如下: ```c #include <stdio.h> #include <math.h> #define N 1024 void hilbert(float *x, float *y) { int i, j, k; float h[N], re[N], im[N], mag[N]; // FFT for (i = 0; i < N; i++) { h[i] = x[i]; re[i] = x[i]; im[i] = 0.0; } fft(re, im, N); // Hilbert Transform for (i = 1; i < N/2; i++) { re[i] *= 2.0; im[i] *= 2.0; } for (i = N/2; i < N; i++) { re[i] = 0.0; im[i] = 0.0; } ifft(re, im, N); // Magnitude and Phase Calculation for (i = 0; i < N; i++) { mag[i] = sqrt(re[i]*re[i] + im[i]*im[i]); y[i] = atan2(im[i], re[i]); } } void fft(float *re, float *im, int n) { int i, j, k; float tr, ti, ur, ui, sr, si; j = 0; for (i = 0; i < n; i++) { if (j > i) { tr = re[j]; ti = im[j]; re[j] = re[i]; im[j] = im[i]; re[i] = tr; im[i] = ti; } k = n/2; while (k <= j) { j -= k; k /= 2; } j += k; } for (k = 1; k < n; k *= 2) { sr = cos(M_PI/k); si = -sin(M_PI/k); ur = 1.0; ui = 0.0; for (j = 0; j < k; j++) { for (i = j; i < n; i += 2*k) { tr = ur*re[i+k] - ui*im[i+k]; ti = ur*im[i+k] + ui*re[i+k]; re[i+k] = re[i] - tr; im[i+k] = im[i] - ti; re[i] += tr; im[i] += ti; } tr = ur; ur = tr*sr - ui*si; ui = tr*si + ui*sr; } } } void ifft(float *re, float *im, int n) { int i; for (i = 0; i < n; i++) { im[i] = -im[i]; } fft(re, im, n); for (i = 0; i < n; i++) { re[i] /= n; im[i] = -im[i]/n; } } int main() { float x[N], y[N]; int i; // Generate Input Signal for (i = 0; i < N; i++) { x[i] = sin(2*M_PI*50*i/1000) + sin(2*M_PI*150*i/1000); } // Hilbert Transform hilbert(x, y); // Output Results for (i = 0; i < N; i++) { printf("%f %f\n", x[i], y[i]); } return 0; } ``` 其中,`hilbert` 函数实现希尔伯特变换,`fft` 和 `ifft` 函数实现了快速傅里叶变换和逆变换。在 `main` 函数中,首先生成一个包含两个正弦波的输入信号,然后调用 `hilbert` 函数进行希尔伯特变换,最后输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值