离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称
封面是福州的福道,从高处往下看福道上的人在转圈圈。从傅里叶变换后的频域角度来看,我们的生活也是一直在转圈圈,转圈圈也是好事,说明生活有规律,而我们应该思考的是,如何更有效率地转圈圈……哦别误会,我真不是在说内卷(狗头)。
本文会讲到离散傅里叶、实信号、负频率、fftshift、实信号、共轭等概念。
离散傅里叶变换
上一篇文章里面写到了离散傅里叶变换。
公式如上,我发现,只要掌握初中的数学——加减乘除以及三角函数,就可以掌握离散傅里叶变换的运算。
上文中说过:
如果有时域数据如: [1, 2, 3] 的话,
那么代入公式算得频域数据的结果为:
[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i]
频域数据,就是时域数据依次代入到离散傅里叶变换公式的结果。
下面是对频域数据第二个复数:-1.5 + 0.86603i的推算过程。如下:
此时N = 3,k = 1,n = [0, 1, 2]代入到上述公式得:
只要懂得计算:
即可得出整个式子的结果。以上式子表达的即为,一个长度为3的线段,一端在坐标原点上,且线段和X轴(实部)的正半轴重叠。然后线段以坐标原点为圆心,顺时针旋转4π/3。该线段在X轴上的投影即为实部,在Y轴上的投影即为虚部。如下(手残字丑预警):
这里多说一句,如果时域信号也是复数且虚部有值的话,例如[3, 1],那么上图中,起始位置的[3, 0]改成[3, 1]即可,再做同样的4π/3旋转。
实部:-3 * cos(π/3) = -1.5
虚部:3 * sin(π/3) = 2.59808
即为:
同理可得:
以上相加:
1 + (-1 - i*1.732050) + (-1.5 + i*2.59808) = -1.5 + 0.86603i
至此,我们大约已经掌握了DFT(离散傅里叶变换)。DFT即计算三角函数和数据累加的过程,甚至我们也可以自己实现一个DFT函数。
fftshift
FFT即快速傅里叶变换,一种非常高效的DFT函数实现。
通常做完FFT之后,很多场景下会做fftshift。
fftshift是针对频域的,将FFT直流分量移到频谱中心。fftshift就是对换数据的左右两边置换如:
x=[1 2 3 4]
fftshift(x) -> [3 4 1 2]
用matlab或者octave运行以下代码:
clf;
fs=100;N=256; %采样频率和数据点数
n=0:N-1;t=n/fs; %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y1=fft(x,N); %对信号进行快速Fourier变换
y2=fftshift(y1);
mag1=abs(y1); %求得Fourier变换后的振幅
mag2=abs(y2);
f1=n*fs/N; %频率序列
f2=n*fs/N-fs/2;
subplot(2,1,1),plot(f1,mag1,'r'); %绘出随频率变化的振幅
xlabel('Freq Hz');
ylabel('Amp');title('plot 1 usual FFT','color','r');grid on;
subplot(2,1,2),plot(f2,mag2,'m'); %绘出随频率变化的振幅
xlabel('Freq Hz');
ylabel('Amp');title('plot 2 FFT after fftshift','color','m');grid on;
可以看到fftshift完成了shift的功能,但也暗含了额外的信息。
- 为什么60Hz可以当做是-40Hz,15Hz可以当做是-85Hz?又或者为什么会有负频率?
- 为什么频点40和-40有相同的振幅?
接下来就这两点展开讨论。
负频率
我们还是以时域数据[1, 2, 3] fft后 --> [6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i],作为例子。
[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i] 中的三个数字分别代表0Hz, 1Hz, 2Hz的频点信息。对它做fftshift则会变成:
[-1.5 - 0.86603i, 6 + 0i, -1.5 + 0.86603i]这分别代表-1Hz,0Hz,1Hz的频点信息。原本的2Hz的也就是-1Hz。
为什么?还是要从离散傅里叶变换的公式说起:
还记得我们求频域数据[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i] 中1Hz的-1.5 + 0.86603i的式子吗?
如果求2Hz的式子是这样的:
即为:
也即为:
以上求2Hz的式子和以下求1Hz的式子再对比一下:
1Hz是顺时针旋转,2Hz是逆时针旋转,旋转的度数是一样的,只是旋转的方向不一样。
所以当N为3时,2Hz即为-1Hz,就是相对1Hz反着旋转。
以上现象公式是可以推导出来的,如下:
实信号的频域,共轭对称
为什么频点40和-40有相同的振幅?因为时域信号是实信号,所谓实信号,即为信号中数据的虚部为0。
所谓共轭,就是实部相同,虚部的符号相反的一对复数。
实信号经过DFT之后,频域信号是共轭对称的,两个数如果共轭,则代表这两个值的幅值相同,相位不同。频点40和-40频点的值是共轭的,所以有相同的振幅。
我们还是以[1, 2, 3]为例子,实信号[1, 2, 3]的频谱是[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i]。
1Hz的-1.5 + 0.86603i和-1Hz的-1.5 - 0.86603i就是共轭对称的。这不是巧合。
这也是暗含在离散傅里叶变换公式中的一个信息。可以推导出来,这还是牵扯到1Hz和-1Hz的频点信息的关系,如下:
如果x(n)是实信号,那么X(k)与X(N - k)则互为共轭,怎么理解?
其中 $$ e^{-i\times \frac{2\pi nk}{N}} $$ 和 $$ e^{i\times \frac{2\pi nk}{N}} $$ 已经是互为共轭了,就看x(n)的值中的虚部是否为零了。
示意图如下(手残字丑预警):
以上简化了生成1Hz的多个向量,仅为示意,但是1Hz和-1Hz频点的关系一目了然,也解释了为什么仅在实信号时,正负频率是共轭的。
思考另一个角度
频域信号中所有频点代表的曲线,他们的累加即为时域信号。
想象一下(其实是我不会画图 - -),在一个复平面上如何构建一个,在实部投影是40Hz的cos信号,但虚部投影是0的曲线?
我们是否需要两个复平面曲线,一个如下图,假设它的相位和幅值是a + bi,并且以40Hz的频率逆时针旋转。
另一个自行脑补,假设它的相位和幅值是a - bi,并且以40Hz的频率顺时针旋转。
以上两个曲线相加,是否能在一个复平面上如何构建一个,在实部投影是40Hz的cos,但虚部投影是0的曲线呢?
如果本文中有哪些没说清楚的地方,欢迎后台私信我,一起讨论。
参考资料
离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称的更多相关文章
- 【转】离散傅里叶变换-DFT(FFT)基础
转:https://blog.csdn.net/zhangxz259/article/details/81627341 什么是离散傅里叶变换 matlab例子 本文是从最基础的知识开始讲解,力求用最通 ...
- Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
我是做Tracking 的,对于速度要求非常高.发现傅里叶变换能够使用. 于是学习之. 核心: 最根本的一点就是将时域内的信号转移到频域里面.这样时域里的卷积能够转换为频域内的乘积! 在分析图像信号的 ...
- 离散傅里叶变换DFT入门
网上对于傅里叶变换相关的文章很多(足够多),有的是从物理相关角度入场,有的从数学分析角度入场.对于有志学习相关概念的同学还是能够很好的理解的. 数学包括三大块:代数学.几何.数学分析.前两块我们在中学 ...
- 从傅里叶级数(Fourier series)到离散傅里叶变换(Discrete Fourier transform)
从傅里叶级数(Fourier series)到离散傅里叶变换(Discrete Fourier transform) 一. 傅里叶级数(FS) 首先从最直观的开始,我们有一个信号\(x(t)\)(满足 ...
- 离散傅里叶变换(DFT)
目录 一.研究的意义 二.DFT的定义 三.DFT与傅里叶变换和Z变换的关系 四.DFT的周期性 五.matlab实验 五.1 程序 ...
- opencv3.2.0图像离散傅里叶变换
源码: ##名称:离散傅里叶变换 ##平台:QT5.7.1+opencv3.2.0 ##日期:2017年12月13. /**** 新建QT控制台程序****/ #include <QCoreAp ...
- c语言数字图像处理(六):二维离散傅里叶变换
基础知识 复数表示 C = R + jI 极坐标:C = |C|(cosθ + jsinθ) 欧拉公式:C = |C|ejθ 有关更多的时域与复频域的知识可以学习复变函数与积分变换,本篇文章只给出DF ...
- 五、c++实现离散傅里叶变换
C++离散傅里叶变换 一.序言: 该教程基于之前的图像处理类MYCV,是对其的补充. 二.设计目标 对图像进行简单的离散傅里叶变换,并输出生成的频谱图. 三.需要提前掌握的知识 二维傅里叶变换公式: ...
- opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)
离散傅里叶变换 #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" ...
随机推荐
- (九)VMware Harbor 项目管理-上传/下载镜像
VMware Harbor项目管理 Harbor中的项目包含应用程序的所有存储库. Harbor有两类项目: 公共:所有用户都拥有公共项目的读取权限,您可以方便地以这种方式与其他人共享一些存储库. 私 ...
- 吉特日化MES&WMS系统--三色灯控制协议转http
关于硬件控制大部分都是使用CS客户端程序,一般连接口都是用网口,串口,USB口等,应用通讯是不支持HTTp协议操作的,而目前一般做技术的人员都在于BS开发,使用HTTP 协议,所以在硬件交互上可能觉得 ...
- Alignment of Code UVA - 1593
You are working in a team that writes Incredibly Customizable Programming Codewriter (ICPC) which ...
- hdu1529 差分约束(好题)
题意: 超市在每个时间都有需要的人数(24小时)比如 1 0 0 0 0 ....也就是说在第0个小时的时候要用一个人,其他的时间都不用人,在给你一些人工作的起始时间,如果雇佣了这个人,那 ...
- Python中os模块、csv模块和xlrd模块的使用
目录 os模块的使用 open("test.txt","mode") 读取文件中的内容 f.read() f.readline(size) f.readline ...
- (CV学习笔记)梯度下降优化算法
梯度下降法 梯度下降法是训练神经网络最常用的优化算法 梯度下降法(Gradient descent)是一个 ==一阶最优化算法== ,通常也称为最速下降法.要使用梯度下降法找到一个函数的 ==局部最小 ...
- 《前端运维》一、Linux基础--基础命令(1)
在开始之前,你需要做一些准备工作,去阿里买一台服务器,服务器的具体细节其实并不是十分重要,我也不会在这里一步一步的教大家如何去买一个服务器.百度一下足够了,但是还是要贴一下这篇文章中,我所使用的服务器 ...
- 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件
碰到这个问题很多次,每次碰到都是去百度找.但是,不尽人意,好在最后还是解决了,所以写下总结. 报错内容: org.apache.catalina.core.StandardContext.startI ...
- unbuntu下清理磁盘空间
把很多大文件删除,并清空回收站后,发现可用存储空间并没增大,如图: 用find /home -size +500k 过滤出大于500k bytes的文件,发现原来删除的yuv文件都被置于.cache目 ...
- ecl函数的用法
相关函数 fork, execle, execlp, execv, execve, execvp Windows下头文件 #include <process.h> Linux下头文件 #i ...