通常我们用到的信号都是实值信号,但是我们可以根据这个实信号构造出一个复信号,使得这个复信号只包含正频率部分,而且这个复信号的实部正好就是我们原来的实值信号。简单的推导可知,复信号的虚部是原信号的希尔伯特变换。这样构造出来的信号就叫做解析信号。因此,如何生成解析信号与如何对一个信号进行希尔伯特变换其实是等价的问题。获得解析信号后可以计算波形的包络、瞬时频率、相位等,是非常有用的。所以如何生成解析信号也是个有意义的课题。

对于有限长的序列,计算其频谱,然后将频谱的负频率部分设为0 是最直接的办法。但是实际操作时还是有些小的技巧的,否则你会发现总是得不到正确的结果。

下面举例来说明:

有如下数据

x = [ 1; 2; 2; 1; 1; 2; 2; 1];

FFT 后的结果是

    12.
0
- 2. - 2.i
0
0
0
- 2. + 2.i
0

按照最普通的想法

然后反变换回去,得到结果为:

1.25 - 0.25i
1.75 - 0.25i
1.75 + 0.25i
1.25 + 0.25i
1.25 - 0.25i
1.75 - 0.25i
1.75 + 0.25i
1.25 + 0.25i

可以看到实部并不相等,所以这样变换是不正确的。问题在于没有注意到边界点的处理。正确的公式如下:

按照这个公式,Z[m] 计算如下:

12
0
- 4. - 4.i
0
0
0
0
0

反变换后

1 - 0.5i
2 - 0.5i
2 + 0.5i
1 + 0.5i
1 - 0.5i
2 - 0.5i
2 + 0.5i
1 + 0.5i

可以看到这样变换的结果才正确。

由于解析信号没有负频率部分。所以相应的采样频率也可以降低一半而不至混叠。将计算解析信号与降采样两步合并到一起计算的算法如下:

还以上面的数据为例:

Z =
6.
0
- 2. - 2.i
0

反变换后的结果如下:

1- 0.5i
2. + 0.5i
1. - 0.5i
2. + 0.5i

确认结果正确。

刚才是降采样,如果要加密采样点可以用类似的方法。

对应的scilab代码如下:

x = [ 1; 2; 2; 1; 1; 2; 2; 1];
N =length(x);
M = 4;
X =fft(x);
Z= M * ifft([X(1); 2*X(2:N/2);X(N/2+1);zeros(M*N-N/2-1,1)]);

大家可以自行验证。

本文中没有设计到具体公式的推导,希望获得详细信息的人可以阅读 Lawrence 写的文章 "Computing the Discrete-Time Analytic signal via FFT"。

利用FFT 计算生成离散解析信号的更多相关文章

  1. 利用Xstream注解生成和解析xml

    实体类: @XStreamAlias("person") public class PersonBean {     @XStreamAlias("firstName&q ...

  2. java 利用Xstream注解生成和解析xml

    https://www.oschina.net/code/snippet_116183_14202#23325

  3. 解析利用wsdl.exe生成webservice代理类的详解

    利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...

  4. Android 利用Gson生成或解析json

    目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https://code.google.com/p/google-gson/ 下载的放在lib并导入,若 ...

  5. Amdroid示例:利用Gson生成或解析json

    转自:http://www.cnblogs.com/liqw/p/4266209.html 目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https: ...

  6. DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST

    Delphi XE10,Json 生成和解析,再利用indyhttp控件Post 年09月20日 :: 阅读数: --不多说,直接上代码 procedure TFrmMain.Brand; var J ...

  7. Python分析离散心率信号(下)

    Python分析离散心率信号(下) 如何使用动态阈值,信号过滤和离群值检测来改善峰值检测. 一些理论和背景 到目前为止,一直在研究如何分析心率信号并从中提取最广泛使用的时域和频域度量.但是,使用的信号 ...

  8. [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)

    卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...

  9. Python分析离散心率信号(中)

    Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...

随机推荐

  1. ubuntu下vpn无反应的解决办法

    mv ~/.gconf  ~/.gcongbk0 sudo reboot

  2. Microsoft Jet 数据库引擎找不到对象'Sheet1$_'。请确定对象是否存在,并正确地写出它的名称和路径

    We have a CRM add-on for Importing Price Lists into CRM. For this tool, we expect the details to be ...

  3. MyEclipse2014不支持jre1.8吗

    myeclipse 2015才支持了java 8 也可以用Eclipse Kepler加插件的形式来支持java 8

  4. use utf8

    [root@wx03 0724]# cat a2.pl use Encode; my $a=<STDIN>; my $b=encode_utf8('微信'); print "\$ ...

  5. 基于visual Studio2013解决C语言竞赛题之0405阶乘求和

      题目 解决代码及点评 这道题和上一道题类似,第n个累加项 = n-1累加项的n倍 由于有这个规律,我们可以用一个for循环实现 但是例子代码并没有这么做,大家可以回去修改下代码,使得代码更 ...

  6. javascript使用消息框

    之前很多地方都用过alert,它的作用是弹出一个警告框,我们调用的方法是alert("输入的内容");其实更正确的写法是 window.alert("输入的内容" ...

  7. 注解配置 ssh

    注解 <?xml version="1.0" encoding="UTF-8"? > <beans xmlns="http://ww ...

  8. 巡逻机器人(BFS)

    巡逻机器人问题(F - BFS,推荐) Description   A robot has to patrol around a rectangular area which is in a form ...

  9. C#学习之在辅助线程中修改UI控件----invoke方法

    Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invo ...

  10. PyQt中登录框设计

    很多软件,比如QQ,亦或一些管理系统,运行之后都会先弹出一个登录框,只有登录成功了,才能进入软件主界面. 以前在邮件列表中回答过如何做登录框,这里重新整理下. 从刚开始做Delphi的时候就有不少人纠 ...