从零开始傅里叶变换

1.前言

    傅里叶变换是很多领域的基础工具,常用来做频域变换。但凭什么傅里叶变换可以转换至频域,又什么是频域。看门见山。
    连续傅里叶变换公式:
F ( w ) = < f ( t ) , e i w t > = ∫ − ∞ + ∞ f ( t ) e − i w t d t (1.1) F(w) = <f(t),e^{iwt}>=\int_{-\infty}^{+\infty}f(t)e^{-iwt}dt\tag{1.1} F(w)=<f(t),eiwt>=+f(t)eiwtdt(1.1)
    单单看这个公式确实让人头大。还好鲁迅说过把复杂的问题拆分成各个简单的问题,解决完简单的问题,再和起来,就解决了复杂的问题。
傅里叶公式导图
    根据上图,我们就可得出,傅里叶变换是
        原信号 f ( t ) f(t) f(t) e i w t e^{iwt} eiwt的内积= F ( w ) F(w) F(w)(即原信号在角频率w上的分量)
等价于
        原信号f(t)与 e − i w t e^{-iwt} eiwt在所有时间上的积分。
我们现在这里给出最终结论:
傅里叶变换的本质就是内积,而内积的对象是由同频三角函数组成的 e i w t e^{iwt} eiwt。通过与 e i w t e^{iwt} eiwt的内积(投影),分离出角频率为w的分量,而 ∫ − ∞ + ∞ \int_{-\infty}^{+\infty} +就是将信号每个时刻的w的分量叠加(即振幅)。
    为什么和 e i w t e^{iwt} eiwt一参合就到频域上了。我们继续一步步拆开 e i w t e^{iwt} eiwt看看它到底意味着什么?

2. e i w t e^{iwt} eiwt的秘密

2.1 从e说起

    e是自然常数,等于2.718281828459。好奇心又来了,为什么这个叫自然常数呢,这个2.71828…怎么看都不自然啊?先甩大招:
    e的定义式为:
lim ⁡ n → ∞ ( 1 + 1 n ) n = e (2.1.1) \lim\limits_{n \to \infty}(1+\frac {1} {n})^n=e \tag{2.1.1} nlim(1+n1)n=e(2.1.1)
    公式表明当n趋于无穷大的时候 ( 1 + 1 n ) n (1+\frac {1} {n})^n (1+n1)n等于e。哦吼,这有什么特殊含义嘛?
    举个栗子,我在银行存了1元钱,年利率100%数学表达式为
( 1 + 100 % 1 ) 1 = 2 元 (1+ \frac{100\%}{1})^1=2元 (1+1100%)1=2
    但是一想,好像有点亏,我放了一年就计算一次利息,如果要是每月结一次利息就好了,利滚利就更多了,那就是
( 1 + 100 % 12 ) 12 = 2.613 元 (1+ \frac{100\%}{12})^{12} =2.613元 (1+12100%)12=2.613
    让我们更贪婪一点,要是每天算一次,每小时算一次,甚至时时刻刻都算一次,那能拿多少
lim ⁡ n → ∞ ( 1 + 1 n ) n = e \lim\limits_{n \to \infty}(1+\frac {1} {n})^n=e nlim(1+n1)n=e
    哦豁,就是e了。
    从每年算一次,到每时每刻算,是从离散到连续的过程。而在大千世界中,事物都是动态连续变化的,系统的此时的变量会参与到下一时刻的变化。
    式(2.11)说明一个单位状态量的变化率是固定100%的系统,e代表了在一个单位时间内,连续的翻倍增长所能达到的极限值
    那如果变化率没那么巧,是100%呢?不妨设年利率是x,式(2.1.1)即为
lim ⁡ n → ∞ ( 1 + x n ) n = lim ⁡ n → ∞ ( ( 1 + 1 n / x ) n / x ) x = e x (2.1.2) \lim\limits_{n \to \infty}(1+\frac {x} {n})^n=\lim\limits_{n \to \infty}((1+\frac {1} {n/x})^{n/x} )^x=e^x \tag{2.1.2} nlim(1+nx)n=nlim(1+n/x1)n/x)x=ex(2.1.2)
    由上可得,一个单位状态量变化率是固定值的系统,其状态就可以用自然常数的指数函数来表示。
    前面我们考虑的都是单位时间,我们再把时间加入考虑范围,设时间为t,则:
f ( t ) = e x t (2.1.3) f(t) =e^{xt} \tag{2.1.3} f(t)=ext(2.1.3)
    哈哈哈,好了,我们发现和 e i w t e^{iwt} eiwt是令x=iw,让我们继续往下看。

2.2 i复数的几何意义

    我们都知道 1 ∗ ( − 1 ) = − 1 ; 1 ∗ ( − 1 ) ∗ ( − 1 ) = 1 1*(-1)=-1;1*(-1)*(-1)=1 1(1)=11(1)(1)=1。引入几何学,画出下图:
在这里插入图片描述
    可以发现,在上图中,*(-1)在几何中,等价于逆时针旋转180度。那好奇猫肯定要问了,如果我偏要旋转90度呢?
    旋转180度等于 ∗ ( − 1 ) *(-1) (1)为已知条件。我们设i为旋转90度需要乘的数。
即我们旋转180度,需要乘2次i,可得 1 ∗ i ∗ i = − 1 1*i*i =-1 1ii=1
    化简得
i = − 1 2 (2.2.1) i=\sqrt[2]{-1}\tag{2.2.1} i=21 (2.2.1)
    画图得
在这里插入图片描述
    如此一来,我们构建出了一个2维坐标系,好玩的就变多了。
    以前我们表达一个二维平面点需要2个数(x,y),但是现在用上i后,我们发现一个复数就可以表示一个点的位置。
在这里插入图片描述
    一个数表示原来2个数因此称这个数为复数。

2.3 e i x = c o s ( x ) + i s i n ( x ) e^{ix}=cos(x)+isin(x) eix=cos(x)+isin(x) 欧拉!

    前面的文章我们讲到e,i这两个神奇的数字,但并未说明他们有什么关联。历史告诉我们,当世界支离破碎的时候,常常就会天降猛男。同理这时候,欧拉来了,带来了欧拉公式
e i x = c o s ( x ) + i s i n ( x ) (2.3.1) e^{ix} = cos(x)+isin(x)\tag{2.3.1} eix=cos(x)+isin(x)(2.3.1)
    关于欧拉公式通过泰勒级数的推导,可以看下面的文章
                    https://baijiahao.baidu.com/s?id=1681031751212927869&wfr=spider&for=pc
    下面通过直观的图形化过程进行讲解。
e i x = lim ⁡ n → ∞ ( 1 + i x / n ) n (2.3.2) e^{i x}=\lim _{n \rightarrow \infty}(1+i x / n)^{n} \tag{2.3.2} eix=nlim(1+ix/n)n(2.3.2)
    通过matlab绘制公式2.3.2图

x = 0:10:1000;			%任意值
n = 10000000000;		%n趋于无穷大
e_ix =(1+x* i./n).^n;	%计算e_ix值
compass(e_ix);			%画出罗盘图

得到
在这里插入图片描述
    由图可得,无论x为任何值, e i x e^{i x} eix单位圆(以原点为圆心,半径为1的圆)上的一点。
由此,我们可以得出下图
复平面图
    同理可得, c o s ( x ) + i s i n ( x ) cos(x)+isin(x) cos(x)+isin(x)为复平面上的一点,或者表示为以0为起点的一个向量。
    因此,傅里叶公式中的 e i w t e^{iwt} eiwt即等价为 c o s ( w t ) + i ∗ s i n ( w t ) cos(wt)+i*sin(wt) cos(wt)+isin(wt)的向量,模长为1,相位为 w t wt wt

2.4 <>内积

    接着我们继续理解内积的意义。内积用于向量的计算,以向量 a ⃗ = ( 1 , 2 ) , b ⃗ = ( 1 , 0 ) \vec{a}=(1,2),\vec{b}=(1,0) a =(1,2),b =(1,0)为例:
< ( 1 , 2 ) , ( 1 , 0 ) > = ∣ ( 1 , 2 ) ∣ ∗ ∣ ( 1 , 0 ) ∣ ∗ c o s ( θ ) = 1 ∗ 1 + 2 ∗ 0 = 1 <(1,2),(1,0)> = |(1,2)|*|(1,0)|*cos(\theta) =1*1+2*0 = 1 <(1,2)(1,0)>=(1,2)(1,0)cos(θ)=11+20=1
    其几何含义为向量 a ⃗ \vec{a} a 在向量 b ⃗ \vec{b} b 上的投影,内积的结果即为系数。如果2个向量夹角为90度,则 c o s ( θ ) = 0 cos(\theta)=0 cos(θ)=0,其内积为0,即2个向量正交。
    同理如果将向量扩展至n维,则其内积为
< a ⃗ , b ⃗ > = a 1 ∗ b 1 + a 2 ∗ b 2 . . . + a n ∗ b n = ∑ i = 1 n ( a i ∗ b i ) <\vec{a},\vec{b}> =a_1*b_1+a_2*b_2...+a_n*b_n = \sum_{i=1}^{n}(a_i*b_i) <a ,b >=a1b1+a2b2...+anbn=i=1n(aibi)
    继续将其扩展至函数,函数是连续的,连续(即dx趋于无穷小)的累加为积分。令 a = f ( x ) , b = g ( x ) a = f(x),b = g(x) a=f(x),b=g(x)
< a , b > = ∫ − ∞ + ∞ f ( x ) ∗ g ( x ) ∗ d x (2.4.1) <a,b> =\int_{-\infty}^{+\infty}f(x)*g(x)*dx\tag{2.4.1} <a,b>=+f(x)g(x)dx(2.4.1)
    继续扩展至复函数, i = ( − 1 ) 0.5 i=(-1)^{0.5} i=(1)0.5,复平面上的向量 a = 1 + i a=1+i a=1+i
< a , a > = ∣ 1 + i ∣ ∗ ∣ 1 + 1 i ∣ ∗ c o s ( θ ) = 1 ∗ 1 − i ∗ i = 1 ∗ 1 + i ∗ ( − i ) = 2 <a,a> = |1+i|*|1+1i|*cos(\theta) =1*1 - i*i =1*1+i*(-i) =2 <a,a>=1+i1+1icos(θ)=11ii=11+i(i)=2
    由于复平面上 i = ( − 1 ) 0.5 i=(-1)^{0.5} i=(1)0.5,为了保证内积结果为正数,即保证投影的结果为正。内积计算需将虚部部分变为相减,等价于其中一个向量取共轭( a ⃗ = 1 + i \vec{a}=1+i a =1+i取共轭为 a ‾ = 1 − i \overline{a} =1-i a=1i)。

    同理,推广至复函数,设a,b为复函数,则内积计算为
< a , b > = ∫ − ∞ + ∞ f ( x ) ∗ g ( x ) ‾ ∗ d x (2.4.2) <a,b> =\int_{-\infty}^{+\infty}f(x)*\overline{g(x)}*dx\tag{2.4.2} <a,b>=+f(x)g(x)dx(2.4.2)
    因此我们设信号函数为 f ( t ) , g ( t ) ‾ = e i w t f(t),\overline{g(t)}=e^{iwt} f(t),g(t)=eiwt,则函数内积为
< f ( t ) , e i w t > = ∫ − ∞ + ∞ f ( t ) e − i w t d t (2.4.3) <f(t),e^{iwt}>=\int_{-\infty}^{+\infty}f(t)e^{-iwt}dt\tag{2.4.3} <f(t),eiwt>=+f(t)eiwtdt(2.4.3)
    式2.4.2,如果大家还记得的话,就是文章开头的公式。
    我们推导得到了傅里叶变换的含义是信号 f ( t ) f(t) f(t) e i w t e^{iwt} eiwt的内积。2.3的部分我们得到了 e i w t = c o s ( w t ) + i ∗ s i n ( w t ) e^{iwt} = cos(wt)+i*sin(wt) eiwt=cos(wt)+isin(wt) e i w t e^{iwt} eiwt是复平面上的单位向量。
    因此,傅里叶公式的直观意义就是信号 f ( t ) f(t) f(t)在复平面上任一单位向量 e i w t e^{iwt} eiwt的投影,结果为其系数。
    至此,我们关于傅里叶变换的问题变为 为什么选择在 e i w t e^{iwt} eiwt上做投影,又为什么和频域挂上钩的?

2.5 三角函数的妙用

    三角函数( s i n , c o s sin,cos sin,cos)是完备的正交函数集。什么意思呢?
    三角函数系为:
{ s i n ( 0 x ) , c o s ( 0 x ) , s i n ( x ) , c o s ( x ) , s i n ( 2 x ) , c o s ( 2 x ) , . . . . , s i n ( n x ) , c o s ( n x ) } \{sin(0x),cos(0x),sin(x),cos(x),sin(2x),cos(2x),....,sin(nx),cos(nx)\} {sin(0x),cos(0x),sin(x),cos(x),sin(2x),cos(2x),....,sin(nx),cos(nx)}
    完备的正交函数集的意思为在上述集合中,任选2个元素,其内积为0,即正交。比如:
< c o s ( 0 x ) , c o s ( x ) > = ∫ − π π c o s ( 0 x ) ∗ c o s ( x ) d x = ∫ − π π 1 d x + ∫ − π π c o s ( x ) d x = 0 <cos(0x),cos(x)> = \int_{-\pi}^{\pi}cos(0x)*cos(x) dx= \int_{-\pi}^{\pi}1dx+ \int_{-\pi}^{\pi}cos(x)dx=0 <cos(0x),cos(x)>=ππcos(0x)cos(x)dx=ππ1dx+ππcos(x)dx=0
     s i n ( w t ) , c o s ( w t ) sin(wt),cos(wt) sin(wt),cos(wt)函数随着w的变化,频率发生变化。根据上述定义,可得,不同频率的三角函数内积为0,只有频率相等的三角函数做内积时,才不为0
    通过 e i w t = c o s ( w t ) + i ∗ s i n ( w t ) e^{iwt} = cos(wt)+i*sin(wt) eiwt=cos(wt)+isin(wt)不难发现, e i w t e^{iwt} eiwt由同频率的三角函数相加组成。至此我们可以直观的看出,信号 f ( t ) f(t) f(t) e i w t e^{iwt} eiwt的内积,只有信号 f ( t ) f(t) f(t) e i w t e^{iwt} eiwt同频的分量才会有内积的结果,其余分量内积为0。

    傅里叶变换的本质就是内积,而内积的对象是由同频三角函数组成的 e i w t e^{iwt} eiwt。通过与 e i w t e^{iwt} eiwt的内积(投影),分离出角频率为w的分量,而 ∫ − ∞ + ∞ \int_{-\infty}^{+\infty} +就是将信号每个时刻的w的分量叠加(即振幅)。
    通过选择不同的 e i w t e^{iwt} eiwt便可获取信号不同的频率分量。遍历不同的频率,即形成了频谱。
    这边还有个小问题, e i w t e^{iwt} eiwt如何与真实的信号频率对应上呢,请看下文。

2.6 傅里叶变换的频率分析

    我们通过一个例子来进行讲解。假设我们有个连续信号 f ( t ) = 2 ∗ s i n ( 2 p i ∗ 66.66 ∗ t ) + 3 ∗ c o s ( 2 p i ∗ 88.88 ∗ t ) f(t) = 2*sin(2pi*66.66*t)+3*cos(2pi*88.88*t) f(t)=2sin(2pi66.66t)+3cos(2pi88.88t)
频率公式为:
f = 1 / T f = 1/T f=1/T
    以 s i n ( 2 p i ∗ 66.66 ∗ t ) sin(2pi*66.66*t) sin(2pi66.66t)为例,周期为 T = 2 p i / w = 2 p i / ( 2 p i ∗ 66.66 ) = 1 / 66.66 T = 2pi/w = 2pi/(2pi*66.66)=1/66.66 T=2pi/w=2pi/(2pi66.66)=1/66.66,因此频率为 f = 1 / T = 66.66 h z f = 1/T =66.66hz f=1/T=66.66hz。同理可得 c o s ( 2 p i ∗ 88.88 ∗ t ) cos(2pi*88.88*t) cos(2pi88.88t)的频率为 88.88 h z 88.88hz 88.88hz。因此该信号有66.66hz和88.88hz的信号。
    接下来进行信号的采集分析。
    首先需要设定采样频率,根据奈奎斯特采样定律,采样频率需至少为信号最高频率的2倍。为什么呢,可以直观的理解,根据傅里叶变换可知,获取信号频率的方法,是和 e i w t = c o s ( w t ) + i ∗ s i n ( w t ) e^{iwt} = cos(wt)+i*sin(wt) eiwt=cos(wt)+isin(wt)做内积,而在采样时,要确定信号最高频率的 c o s ( w t ) , s i n ( w t ) cos(wt),sin(wt) cos(wt)sin(wt)的信息,至少需要确定2个点的位置。如下图。同理可得,最终得到的频谱中,有效的频率区间为采样频率的一半。
在这里插入图片描述
    可以通过这个单位圆来理解采样频率,和采样点数。采样频率代表 e i w t e^{iwt} eiwt在[0,2pi]代表的频率范围,如采样频率为200HZ,即[0,2pi]对应着0-200HZ。而采样点数就是将这0-2pi分成的份数,对应的就是变换的频率。即采样频率,确定频谱的频率范围,采样点数确定频谱的刻度的精细度。比如一把10cm量程(采样频率)的尺子,最高刻度是1cm,那尺子就是将10cm等分成10份(采样点数)。
在这里插入图片描述
    至此,设定仿真参数为采样频率200HZ,采样点数设为100,matlab仿真代码如下:

%% 参数设置
fs=200;     %采样频率
N=100;      %采样总数
n=0:N-1;    %采样点
t=n/fs;     %采样时间间隔
%% 结果计算
y=2*sin(2*pi*66*t)+3*sin(2*pi*88*t);  %时域计算
x=fft(y,N); %傅里叶变换
m=abs(x);   %振幅取绝对值
f=n*(fs/N);   %实际频率换算
%% 绘制结果图
plot(f,m,'-*');  
xlabel('频率/Hz');ylabel('振幅');title('N=100');

在这里插入图片描述
    通过仿真图就可清晰的明白采样频率,和采样点数的意义。随着采样点的增多,频谱分析逐渐精细,最终成功分辨出66.66,和88.88HZ的频率。

2.7 结语

    至此,本人已完成自己的第一篇博客。由于为了尽可能的兼顾直观和严谨,难免存在一些纰漏,希望大家不吝赐教!
    如果大家需要详细的数学推导,在此推荐B站dr_can博士的相关视频。

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 在进行傅里叶变换时,可能会出现2π的跳变,这是因为在计算复指数函数时,使用了弧度制而不是角度制,可以通过以下方法解决: 1. 使用numpy库中的fft函数进行傅里叶变换时,设置参数norm='ortho',即可进行归一化处理,避免出现2π的跳变。 2. 通过在计算复指数函数时,将角度转化为弧度,可以避免出现2π的跳变。可以使用math库中的radians函数将角度转换为弧度,例如math.cos(math.radians(90))。 3. 在进行傅里叶变换时,可以先将信号进行移位处理,使其不再从0开始,而是从一个较大的数开始,这样可以避免出现2π的跳变。 希望以上方法能够帮助到你。 ### 回答2: 傅里叶变换是一种将信号从时域转换到频域的方法,它可以将信号表示成一系列不同频率的正弦和余弦函数的叠加。在使用傅里叶变换时,我们常常遇到频谱中存在2pi的跳变问题。 在Python中,可以使用numpy库中的fft函数进行快速傅里叶变换。然而,由于fft函数默认进行的是以2pi为周期的傅里叶变换,因此在进行变换后的频谱图中,通常会出现以2pi为周期的跳变。 为了解决这个问题,可以使用numpy中的fftshift函数来进行频谱的中心化,从而将跳变移到频谱的中心位置。fftshift函数的具体用法是对fft变换结果的前一半和后一半进行交换,实现频谱的中心化。 另外,如果想要完全去除频谱中2pi的跳变,还可以进行相位调整。通过使用numpy中的angle函数可以获取频谱的相位信息,然后将相位进行调整,使得频谱在相位上连续无间隙。最后,使用ifft函数对调整后的频谱进行逆变换,即可得到去除2pi跳变的信号。 总结起来,Python中可以通过以下步骤去除2pi跳变:先利用fftshift函数对频谱进行中心化处理,再利用angle函数获取相位信息进行调整,最后使用ifft进行逆变换得到去除2pi跳变的信号。 ### 回答3: 在Python中,我们可以使用傅里叶变换将信号从时间域转换到频率域,并对其进行相应的处理。要去除2π跳变,可以采取以下步骤: 首先,我们需要导入相关的库和模块,例如NumPy和SciPy。在Python中,可以使用numpy.fft模块进行傅里叶变换。 接下来,我们需要加载待处理的信号。可以使用numpy的loadtxt函数从文本文件中加载信号数据。例如,可以使用以下代码加载名为“signal.txt”的文件中的数据: ``` import numpy as np signal = np.loadtxt('signal.txt') ``` 然后,我们可以通过调用numpy的fft函数来执行傅里叶变换。例如,可以使用以下代码来执行变换: ``` transformed = np.fft.fft(signal) ``` 完成傅里叶变换后,我们可以对频域中的转换结果进行处理。在这种情况下,我们需要找到频谱中的跳变,并进行2π的修正。一种常用的方法是查找频谱中幅度变化最大的点,并将其相位保持不变。 首先,我们可以计算变换结果的幅度频谱,可以使用以下代码: ``` amplitude = np.abs(transformed) ``` 接下来,我们可以找到幅度变化最大的点的索引,例如,可以使用以下代码: ``` max_index = np.argmax(amplitude) ``` 然后,我们可以通过将幅度为最大幅度点的相位设置为零来修正频谱中的跳变。例如,可以使用以下代码来进行修正: ``` transformed[max_index] = np.abs(transformed[max_index]) ``` 最后,我们可以使用numpy的ifft函数将修正后的傅里叶变换结果转换回时间域。例如,可以使用以下代码进行逆变换: ``` restored = np.fft.ifft(transformed) ``` 完成以上步骤后,变量“restored”将包含去除2π跳变的信号数据。你可以通过将其保存到文件中或对其进行进一步的分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

把事当事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值