MATLAB库函数hilbert(希尔伯特变换)的C语言实现(FFT采用FFTW库)

目录

  • 希尔伯特变换原理公式
  • MATLAB官方帮助文档中希尔伯特变换算法
  • 常量和结构体定义
  • C语言实现(FFTW库的float版,double版类似)

希尔伯特变换原理公式

在这里插入图片描述
在这里插入图片描述

MATLAB官方帮助文档中希尔伯特变换算法

hilbert uses a four-step algorithm:
Calculate the FFT of the input sequence, storing the result in a vector x.
Create a vector h whose elements h(i) have the values:
1 for i = 1, (n/2)+1
2 for i = 2, 3, ... , (n/2)
0 for i = (n/2)+2, ... , n
Calculate the element-wise product of x and h.
Calculate the inverse FFT of the sequence obtained in step 3 and returns the first n elements of the result.

常量和结构体定义

// ConstParam.h
#ifndef CONSTPARAM
#define CONSTPARAM
#include "fftw3.h"const float PI = 3.1415926535897932;
const float TWO_PI = 6.2831853071795864;const int REAL = 0;
const int IMAG = 1;const __int64 BufSize = 1048576;float CosVal[5] = { 1,0.309016994374947,-0.809016994374947 ,-0.809016994374948,0.309016994374947 };
float SinVal[5] = { 0,0.951056516295154, 0.587785252292473, -0.587785252292473, -0.951056516295154 };const float ACC = 40.0;
const float BIGNO = 1.0e10;
const float BIGNI = 1.0e-10;#define max(a,b) (a>b?a:b)typedef struct _Resampler_
{int _upRate;int _downRate;float *_transposedCoefs;float *_state;float *_stateEnd;int _paddedCoefCount;  // ceil(len(coefs)/upRate)*upRateint _coefsPerPhase;    // _paddedCoefCount / upRate__int64 _t; // "time" (modulo upRate)__int64 _xOffset;
}sResampler;
#endif

C语言实现(FFTW库的float版,double版类似)

// hilbert.h
#include <memory.h>
#include "ConstParam.h"
/*
in - 输入数据指针
out - 希尔伯特变换结果数组指针
N - 数据长度
*/
void hilbert(float* in, fftwf_complex* out,int N)
{// copy the data into the complex arrayfor (int i = 0; i < N; ++i){out[i][REAL] = in[i];out[i][IMAG] = 0;}//create a DFT plan and execute itfftwf_plan plan = fftwf_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);fftwf_execute(plan);//destroy the plan to prevent a memory leakfftwf_destroy_plan(plan);int hN = N >> 1;			// half of the length (N /2)int numRem = hN;		// the number of remaining elements// multiply the appropriate values by 2// (those that should be multiplied by 1 are left intact because they wouldn't change)for (int i = 1; i < hN; ++i) // 1,2,...,N/2 - 1 的项乘以2{out[i][REAL] *= 2;out[i][IMAG] *= 2;}// if the length is even, the number of remaining elements decreases by 1if (N % 2 == 0)numRem--;// if it's odd and greater than 1, the middle value must be multiplied by 2else if (N > 1)  // 奇数非空{out[hN][REAL] *= 2; out[hN][IMAG] *= 2;}// set the remaining values to 0// (multiplying by 0 gives 0, so we don't care about the multiplicands)memset(&out[hN + 1][REAL], 0, numRem * sizeof(fftwf_complex));// create an IDFT plan and execute itplan = fftwf_plan_dft_1d(N, out, out, FFTW_BACKWARD, FFTW_ESTIMATE); fftwf_execute(plan);// do some cleaningfftwf_destroy_plan(plan); fftwf_cleanup();// scale the IDFT output for (int i = 0; i < N; ++i){out[i][REAL] /= N;out[i][IMAG] /= N;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理

netbeans7.4有许多例子说明Java异常处理可能比首次出现时要困难得多&#xff0c;Josh Bloch专门将一整章的《 Effective Java》 &#xff08;两个版本&#xff09;专门用于异常处理。 Java中的检查异常模型 仍然 “ 有争议” 。 我很高兴看到我最近下载的NetBeans 7.4 beta有一…

在厚度仅十几微米的电池隔膜找缺陷?人工智能说,能行(人工智能应用案例)

原文链接&#xff1a;https://www.paddlepaddle.org.cn/support/news?actiondetail&id2104 “我们的质检要做的是在厚度仅十几微米的电池隔膜上找出所有微小缺陷&#xff0c;如果没有检测出来&#xff0c;就很可能使新能源汽车的电池在使用过程中出现问题&#xff0c;甚至…

准确率超90%、1秒发出报警,人工智能助国网山东实现无人巡检(人工智能应用案例)

原文链接&#xff1a;https://mp.weixin.qq.com/s/Jh2YLY-4um79ucdHIs5NTg 众所周知&#xff0c;深度学习框架是人工智能的基础技术“底座”&#xff0c;在各大传统产业上也有着巨大的潜力尚待挖掘。5月20日&#xff0c;由深度学习技术及应用国家工程实验室与百度联合主办的“…

基于PaddlePaddle实现高尔夫球场的遥感检测(人工智能应用案例)

原文链接&#xff1a;https://www.paddlepaddle.org.cn/support/news?actiondetail&id2103 1 . 背景及意义 随着高尔夫球运动在我国的兴起&#xff0c;关于高尔夫球场大量占用土地资源、污染环境、耗水量大且公益性差的争议越来越多。国家从2004年开始制定一系列相关政策…

MATLAB库函数firls(最小二乘线性相位FIR滤波器设计)的C语言实现

firls函数功能 FILS设计了一种线性相位FIR滤波器,它可以最小化理想分段线性函数与滤波器在一组期望频带上的幅值响应之间的加权积分平方误差。 b = firls(n,f,a) b = firls(n,f,a,w) b = firls(n,f,a,ftype) b = firls(n,f,a,w,ftype)f是在0和1之间的范围内指定的频率点对的…

数电实验一-初识Multisim和Basys3

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践&#xff01; 一、实验目的 详见报告 二、实验仪器设备 详见报告 三、实验设计过程 使用Multisim为Basys3板卡创建一个PLD设计并进行验证。 1.创建P…

自动化学科前沿讲座作业 基于深度学习的工厂人员监测系统设计

1 背景及应用场景 在工业复杂生产环境下&#xff0c;作业人员的安全问题至关重要。大多数工业企业采用人眼观察视频的方式对作业人员位置进行判断&#xff0c;这种方式长时间会使管理者出现疲劳问题&#xff0c;效率非常低下&#xff0c;遇到安全问题也不能进行及时的处理。采用…

多重继承java_Java中的多重继承与组合vs继承

多重继承java有时我写了几篇有关Java 继承 &#xff0c; 接口和组成的文章。 在这篇文章中&#xff0c;我们将研究多重继承&#xff0c;然后了解组成优于继承的好处。 Java中的多重继承 多重继承是创建具有多个超类的单个类的能力。 与其他一些流行的面向对象的编程语言&#…

数电实验二-点亮一个数码管(Multisim和Basys3 )

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践。 一、实验目的 详见报告 二、实验环境 详见报告 三、实验内容 &#xff08;1&#xff09;基本要求&#xff1a;以Basys3四位拨码开关SW3~SW0为输入…

倍福(Beckhoff)嵌入式控制器PLC

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 摘要&#xff1a;与家喻户晓的西门子相比&#xff0c;倍福&am…

fftw-3.3.8库在linux下的的编译和配置

关注公号【逆向通信猿】更精彩!!! 运行环境 Ubuntu 14.04版本以上,64位系统 FFTW库的下载 首先在官网上下载fftw-3.3.8.tar.gz压缩包,解压。本人下载好的压缩包地址:https://download.csdn.net/download/wlwdecs_dn/12904577 FFTW库的生成 首先,将压缩包进行解压,…

Spring Security with Spring Boot 2.0:密码编码器

在上一篇文章中&#xff0c;我们使用了用户详细信息服务&#xff0c;以便提供一种基于给定用户名从函数加载数据的方法。 用户详细信息的实现可能由内存机制&#xff0c;sql / no-sql数据库等支持。 选项是无限的。 关于密码存储&#xff0c;我们必须注意的是密码哈希。 出…

循环自相关函数和谱相关密度(三)——实信号、复信号模型下的BPSK信号循环谱MATLAB仿真结果及代码

关注公号【逆向通信猿】,循环谱 说明:接上一节循环自相关函数和谱相关密度(二)——实信号、复信号模型下的BPSK信号循环谱推导 7.5 仿真结果 7.5.1 实BPSK信号 符号速率RB = 40,采样率Fs = 960,载波频率fc = 300,符号数N = 1000,矩形成形。

executor线程池框架_如何使用Java 5 Executor框架创建线程池

executor线程池框架Java 5以Executor框架的形式在Java中引入了线程池&#xff0c;它允许Java程序员将任务提交与任务执行分离。 如果要使用Java进行服务器端编程&#xff0c;则线程池是维护系统可伸缩性&#xff0c;鲁棒性和稳定性的重要概念。 对于那些不熟悉Java中的线程池或…

JavaFX技巧29:使布局忽略不可见的节点

在我仍在Swing中实现UI的时候&#xff0c;我曾经是MigLayout的忠实拥护者&#xff08;“一个布局管理者来统治所有这些&#xff0c;对吗Mikael&#xff1f;”&#xff09;。 我真正喜欢的功能之一是当组件不可见时可以定义不同的行为。 MigLayout允许我保留现在不可见的组件所占…

循环自相关函数和谱相关密度(五)——实信号、复信号模型下的QPSK信号循环谱MATLAB仿真结果及代码

关注公号【逆向通信猿】口令:循环谱 说明:接上一节循环自相关函数和谱相关密度(四)——实信号、复信号模型下的QPSK信号循环谱推导 8.4 仿真结果 8.4.1 实QPSK信号 符号速率RB = 40,采样率Fs = 960,载波频率fc = 300,符号数N = 1000,矩形成形,二倍载波频率为符号速…

C++判断是否为素数、求一个数的因数、质因数分解

判断一个数是否为素数 #include<iostream> #include<vector> #include<math.h> #include<algorithm>/*判断是否为素数*/ bool isprime(int n) {bool result;int k (int)sqrt((double)n); // 只需要循环到 √n 即可int i 0;for (i 2; i < k; i){…

第十一届蓝桥杯A组省赛填空试题 C: 蛇形填数(Java)

试题 C: 蛇形填数 本题总分&#xff1a;10 分 【问题描述】 如下图所示&#xff0c;小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。 容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列 的数是多少&#xff1f; 【答案提交】 这是一道结果填空的题&…

Collatz函数的C++递归实现

Collatz函数为(正)自然数定义如下&#xff1a;collatz(N)&#xff1a;如果n是偶数&#xff0c;则返回n/2&#xff0c;否则返回(n∗3)1 #include <iostream> int Collatz(int n) {if (n % 2 0)n / 2;elsen 3 * n 1;return n; }int main(int argc, char* argv[]) {if (…

AI+药物研发:人工智能赋能新药研发(人工智能应用案例)

首先&#xff0c;生物制药行业面临着两个挑战&#xff1a; 第一&#xff0c;新药研发周期很长且非常复杂&#xff1b; 第二&#xff0c;药物研发过程成本昂贵。在1950年的时候&#xff0c;十亿美元可以研发几十个药&#xff0c;到了2020年之后&#xff0c;十亿美元只能研发一个…