傅里叶变换公式整理,意义和定义,概念及推导

2023-05-16

看到论坛有一个朋友提问为什么傅里叶变换可以将时域变为频域?
这个问题真是问到了灵魂深处。

在这我只能简单讲讲我的理解,要深刻理解翻信号处理教科书是最好的方法。

1. 如何描述信号
我们常常用数学模型去抽象物理事件。信号也可以用数学模型来表示。有了信号的数学模型,我们就可以利用数学计算对信号模型做各种各样的改变。如果加以计算机,模电,数电的相关知识,我们就可以将我们对信号模型的改变转换为对物理信号的改变,实现我们的信号处理。
如何用数学模型来描述一个信号呢?首先,肉眼能看到的电磁波(光)与时间是相关的。于是我们有了时域分析模型,它很直观,与t有关,被放在二维平面上时,其中一个轴就是时间轴。我们又用到了幅度值作为第二个轴去描绘信号的强弱。这样就是用二维坐标描述了信号。
要注意的是描述信号这个行为的目的是为了方便我们分析一个信号并用数学的方式处理它,所以我们更喜欢单一变量的简单的信号描述方式。我们学习的时候也是从简单的单一变量的信号开始学习的。

2. 为什么要从频域分析信号?
对于一些有时间变化规律的信号,例如周期信号,人们发现用频率w来描述它比用时间t来描述它更为高效(为啥?W包含了周期信息)。于是就出现了不用t轴,而使用w轴来描述信号的方法,这就是频域分析模型。
如果你还不能理解。那么我只能用从结果推原因的方法解释给你了。

时域描绘上图这样的信号,是可以做到的,但是我们分析和处理信号非常困难。

而从频域描述这个信号的时候,天那,我们发现看到了如此有规律的图像。很多信号处理功能例如滤波能够如此轻易地在频域实现。(因为我们如此清晰地看到了这个信号的各各频率成分)
所以不论从时域还是频域去分析信号,目的是相似的,只是用了不用的角度去描述信号。在信号处理得到发展后,人们渐渐发现某些对信号的处理只能在频域进行。

3. 打通时域和频域:傅里叶变换
刚刚说到两个域都可以描述一个物理事物,那么这两个数学模型就必然存在相互转化的方法。我们的物理学家傅里叶,就提出了相互转化的方式,人们称其为傅里叶变换。
傅里叶怎么想出来傅里叶变换公式的?
对于每一个不同的信号,我们但难道就要建立一个不同的公式吗?比如"你好"和“hello”这两个声波信号可以用两个公式描述,那世上这么多词汇,要用多少公式去描绘?
我们解决这一问题的思路是归一化,用一个恒定的标准的公式去拼凑不规则的多样化的信号。于是就有了信号的分解的问题。就像化学定义中把物质分解成具有统一性质的原子分子等等。于是有机化学能够合成出各种高强度的材料。
傅里叶提出任何连续周期信号可以由多个的正弦曲线组合而成。


我们从时域上看,正弦波与三次谐波相加(+)后形成了规律的合成波。如果谐波越多,将约逼近周期的方波。
于是
他提出了这样的公式,f(t)表示时域周期函数。


一个周期性的时域波形,能够由正弦函数以及它的各次谐波加和而成。
其中

之后配合牛逼的这个公式

就可以将式子转为这样

哇,这样看来就非常接近我们常看到的傅里叶变换公式了。
以上说的都是周期信号,对于非周期信号g(t),我们可以将它视为周期为无穷大的周期信号。于是当T趋近于无穷大的时候,公式有了改写。
得到了我们熟悉的傅里叶变换公式

就此时域和频域打通,时域信号可以频域正弦信号组合而出。后续傅里叶变换的各种特性,各种属性,为我们建立起了宏大的信号处理系统。在这个系统上我们建立了数字通信系统(通信),多媒体系统(终端),AI(各种识别与交互)。

傅里叶变换概念及公式推导

傅里叶变换的目的是可将时域(即时间域)上的信号转变为频域(即频率域)上的信号,随着域的不同,对同一个事物的了解角度也就随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理。

 


(w代表频率,t代表时间,e^-iwt为复变函数) 
傅里叶变换认为一个周期函数(信号)包含多个频率分量,任意函数(信号)f(t)可通过多个周期函数(基函数)相加而合成。 
从物理角度理解傅里叶变换是以一组特殊的函数(三角函数)为正交基,对原函数进行线性变换,物理意义便是原函数在各组基函数的投影

 

我们先从函数f(t)为周期性函数推导,之后推导非周期性函数的傅里叶变换,傅里叶公式一般就是指非周期行函数的傅里叶变换(FT)。 
(1)对于周期为1的函数f(t)

(这里的x我接下来用t来表示) 

根据欧拉公式 


这里的Ck是一个复数,Ck一般称为傅里叶系数,平时对频域的变换,一般改变的就是Ck。 

例如这个图中频域方向上的图每个频域值为Ck的值 

接下来求Ck的值 


对函数两边积分 


(上述的k指频域上的x坐标,每个k值为一种赫兹,t表示时域上的时间) 
因为要模拟一个信号,信号是不能通过有限个周期函数相加而确定这样会有很大的误差,无法得到完整的近似值,于是我们便用无限的周期函数来对其近似 

由此就可以看出傅里叶变换是一种时域与频域的转换关系。

(2)对于非周期函数f(t) 
对于一个信号的处理,信号一般都不是周期的,因此这里就产生了对非周期函数(信号)的处理。 
对于非周期函数我们可以假设为非周期函数是一个周期函数的某个部分,但这个非周期函数的t范围可以非常的大。 
傅里叶变换当周期趋近于无穷,是傅里叶系数的一般化 
傅里叶逆变换是对傅里叶级数的一般化 
设f(t)是周期为T的函数,T趋近于无穷的周期函数 

傅里叶级数[f(t)]转变为 

傅里叶系数为(注:因在无限大的周期T下所以从0->T与(-T/2)->(T/2)是相同的) 

在频谱图中你看到的每一条竖线就是|CK|的值 

这就是一个在时域上的函数图像经过傅里叶变换转换的频谱图。 
很重要的一点是 : 
对于周期为1的函数频域上每条线的间隔为1 
而对于周期为T的函数,频域上的间隔为1/T 
时域周期与频域有反比的关系。

即 T<1 ->1/T>1 频谱会被扩展 
当 T>1 ->1/T<1 频谱会被压缩 
特别的当T趋近于无穷,频谱间隔越来越近,最终频谱变为连续的。 
由此可以得到一句经常看到的话,当时域从周期转化为非周期时,频域从离散的转化为连续的。 
看来把一个非周期函数看作是一个周期函数的一部分这样就能的出傅里叶变换的结果了莫? 
其实是这样是不完全正确的。因为当T趋近于无穷时Ck会趋向于零使得整个傅里叶系数的公式没有意义: 
设f(t)在区间a,b之间其他为0,取一个大的周期T使a>-T/2&&b>T/2,然后以T为函数扩展(|Ck|因为是复函数所以关于x轴对称) 
如下图: 

(在a,b外函数是0) 
(负指数的值为1) 
这时这个值为一个固定的值M 

即 Ck=0。 
连每个频率的系数都是0,那这f(t)还有什么用。 
为此我们从另一个角度看 
设gf这个公式为关于k/T的函数gf(k/T) 

(即Ck不要1/T的部分) 

(这里和上面推导f(t)的结果是一样的) 
因T->∞,gf(k/T)中k/T这个离散变量之间越来越趋近,1/T,2/T,3/T……这样函数就从离散的变为连续,我们将这个k/T连续变量设为s 
这样
关于f(t),f(t)可以看作无数个连续的gf(s)e^2πist,乘以1/T来组成将其看作累加和变换为积分。即 

这样我们就最终得到了傅里叶变换公式(FT)(傅里叶变换也可以称为一种算子): 

顺便给出傅里叶反变换公式: 

文章参考:https://www.zhihu.com/question/19714540 
https://www.zhihu.com/question/38841975 

 

这原本是我在知乎上对傅立叶变换、拉普拉斯变换、Z变换的联系?为什么要进行这些变换。研究的都是什么?问题的回答,实际上是我在本科学习数学和信号处理期间的思考,知乎上的答案因为写得仓促,只写了一些大致思想,没有具体展开,也没有图,比较难以理解,这里重新整理了一下,汇成此文。

本文要求读者需要在对傅里叶变换有一定的了解的基础之上阅读,至少要知道怎么算傅里叶变换。 此外部分地方要求读者有一定的微分方程基础,至少会求简谐振子的二阶常微分方程吧。

  • 什么是傅里叶变换
  • 为什么要分解为正弦波的叠加
  • 傅里叶变换与信号系统
  • 傅里叶变换与量子力学
  • 傅里叶变换、拉普拉斯、Z变换、离散傅里叶变换的关系
  • 傅里叶变换特殊的原因解释
  • 其他微分算子的特征函数举例

什么是傅里叶变换

高等数学中一般是从周期函数的傅里叶级数开始介绍的,这里也不例外。简单的说,从高中我们就学过一个理想的波可以用三角函数来描述,但是实际上的波可以是各种奇形怪状的。首先我们来看具有固定周期的波,下图中展示了4种常见的周期波。傅里叶级数告诉我们,这些周期信号都可以分解为有限或无限个正弦波或余弦波的叠加,且这些波的频率都是原始信号频率的整数倍。

 

这里被称为这些波的基频,代表直流系数,系数被称为幅度,被称作相位。根据幅度和相位可以利用反变换恢复信号的波形,因此幅度和相位包含了信号的全部信息。这里的幅度关于频率的函数,我们称之为频谱,相位关于频率的函数,称之为相位谱。

waveforms.svg

下图是矩形波分解为多个正弦波的示意图,随着正弦波数目的增加,可以无限地逼近矩形波。 对于非周期信号,我们不能简单地将它展开为可数个正弦波的叠加,但是可以利用傅里叶变换展开为不可数的正弦波的叠加,其表达式可以通过简单得到。

 

我们日常遇到的琴音、震动等都可以分解为正弦波的叠加,电路中的周期电压信号等信号都可以分解为正弦波的叠加。 那么问题来了,为什么我们要将信号分解为正弦波的叠加呢?这里面包含两个问题,为什么要分解?为什么是正弦波(或余弦波),可不可以是其他的波?另一个问题是对通信的同学的,我们学过多个变换那么这些变换之间有哪些关系? 在下面的篇章中,我将回答这三个问题。

fourier_series.svg

为什么要分解为正弦波的叠加

这个问题可以追溯到傅里叶变换的创始人傅里叶解热传导方程的时候,因为热传导方程要求读者对热力学有一定了解,这里我以简谐振子系统为例来说明这个问题。没有阻尼的简谐振子系统可以用下面这个微分方程来描述

 

分别代表位移、时间、系统固有频率和外界驱动力。当没有外界驱动力时,这个系统有通解

 

现在我们考虑存在外界驱动力的场景,熟悉常微分方程理论的可以知道此时的通解是上述其次方程的通解(恒为0)加上一个特解,所谓特解就是某个满足上述非齐次方程(不恒为0)的任意一个接!那为什么能做这种分解呢?原因在于这是一个线性系统,或者说这个方程是一个线性方程,因此遵循叠加原理,可以简单的证明这个一般性结论。假设线性系统可以由线性微分方程来描述

 

是线性算子,你可以简单地理解为谐振子方程中的左边操作。如果分别是其次方程通解和非齐次方程特解,即他们满足

 

那么将这两个式子相加,就可以得到

 

因此,只剩下一个问题,对于给定的驱动力,怎么找特解的问题了。 也许你还记得在高数的书上,对为三角函数和指数函数时,可以有和形式相同的特解。 例如时,可以假定非齐次方程也有这种形式的特解,代入原方程,求出待定常数可得特解。指数形式的驱动力也类似,那么对于其他形式的驱动力,怎么求特解呢?很简单,利用线性叠加原理,我如果求出很多个为正弦驱动力下的特解,并且如果可以表达为这些正弦波的叠加,那么特解不就可以用这些特解的叠加得到了么?用数学语言表述就是

 

上面第二个式子右边如果等于,那么左边的就是原齐次方程的特解。 简单地说,就是将驱动力做傅里叶变换(如果是周期驱动力则展开为傅里叶级数),求出每个基驱动力的特解,然后叠加得到特解。当然实际求解不用那么绕,以简谐振动方程为例,直接对方程左右两边做傅里叶变换即得

 

上式带尖头的函数代表时域函数的傅里叶变换,这是一个代数方程,容易求得

 

通过上述描述,我们可以看到,将一个函数做傅里叶变换或者展开为傅里叶级数,可以帮助我们求解线性微分方程,或者从实际意义来说,可以帮助我们分析一个线性系统对外界做出如何响应!之所以能这样展开,是因为我们分析的是线性系统,如果是非线性系统就不能这样操作了。至于为什么是三角函数,我在下面将会回答,接下来我们先来看看更多的例子。

傅里叶变换与信号系统

这里,我们对通信相关的领域再举一个例子,来说明展开为三角函数(或者复指数函数)的重要性。这种分析,我们称之为傅里叶分析,或者叫频谱分析。

一个信号,通常用一个时间的函数来表示,这样简单直观,因为它的函数图像可以看做信号的波形,比如声波和水波等等。很多时候,对信号的处理是很特殊的,比如说线性电路会将输入的正弦信号处理后,输出仍然是正弦信号,只是幅度和相位有一个变化。这是因为线性电路都可以用常系数线性微分方程来描述,输入信号可以看做外界驱动力,输出可以看做系统地响应,这和上面的谐振子方程类似。因此,如果我们将信号全部分解成正弦信号的线性组合(傅里叶变换),那么就可以用一个传递函数来描述这个线性系统。倘若这个信号很特殊,例如,傅里叶变换在数学上不存在,这个时候就引入拉普拉斯变换来解决这个问题。这样一个线性系统都可以用一个传递函数来表示。所以,从这里可以看到将信号分解为正弦函数(傅里叶变换)或者 复指数函数(拉普拉斯变换)对分析线性系统也是至关重要的。

傅里叶变换与量子力学

量子力学的波函数可以用多种不同的表象来描述,例如坐标表象、动量表象、能量表象等,不同表象之间的变换实际上是希尔伯特空间的一个幺正变换,其中坐标表象和动量表象之间的变换就是傅里叶变换。

 

傅里叶变换、拉普拉斯、Z变换、离散傅里叶变换的关系

信号处理中经常要对信号做各种变换,其中傅里叶变换、拉普拉斯、Z变换、离散傅里叶变换是最基础的几个变换。 他们都是为了对信号做频谱分析而采用的变换,只不过被变换的信号会有一些差异。

如果只关心信号本身,不关心系统,这几个变换的关系可以通过下面这样一个过程联系起来。

从模拟信号开始,如果模型信号能量是有限的,那么我们可以对它做傅里叶变换,把它用频域表达为。如果信号的能量是无限的,那么傅里叶变换将不会收敛,这种时候可以对它做拉普拉斯变换。 如果我们将拉普拉斯的域画出来,他是一个复平面,拉普拉斯变换是这个复平面上的一个复变函数。而这个函数沿虚轴的值就是傅里叶变换。

LaplaceFourier

拉普拉斯变换和傅里叶变换广泛应用在模拟电路分析当中,下图就是对模拟电路中基本元件的域建模示意图,当时,就是傅里叶变换了。

S-Domain_circuit_equivalents

需要明确一个观点,不管使用时域还是频域(或s域)来表示一个信号,他们表示的都是同一个信号!也就是说,上面的时域表达、频域表达和域表达都表示的是同一个模拟信号。关于这一点,你可以从线性空间的角度理解。同一个信号,如果采用不同的坐标框架(或者说基向量),那么他们的坐标就不同。例如,采用作为坐标,那么信号就可以表示为,而采用则表示为傅里叶变换的形式。 两个不同坐标框架下,同一个向量的坐标可以通过一个线性变换联系起来,如果是有限维的空间,则可以表示为一个矩阵,在这里是无限维,这个线性变换就是傅里叶变换。

到现在,对信号的形式还没有多少假定,如果信号是带宽受限信号,也就是说只在一个小范围内(如)不为0。之所以要做这个假定以及这个假定的合理性是根据实际需要而定的。在一个通信系统或者信号处理系统中,无限带宽的信号是无法处理的,而且一般接受信号的期间都会有一定的带宽,所以这是对实际中的信号的一种理想假设。现代的信号处理系统多是数字信号处理系统,即使是模拟系统,现在也多将复杂的处理放到数字信号处理子系统端进行处理,这两个系统之间通过 AD、DA 连接起来。根据采样定理,只要采样的频率足够高(大于两倍带宽),就可以无失真地将信号还原出来。那么采样对信号的影响是什么呢?从s平面来看,时域的采样将沿虚轴方向作周期延拓!这个性质从数学上可以很容易验证。下图显示的是就是采样对信号频谱的影响,只画出虚轴上的图像。这个性质也很好的解释了为什么要两倍的采样频率,这样才能使得周期延拓后频谱不会重叠到一起。设是采样频率,则采样后信号在域可以表达为

 

sampling

对于采样后的信号,可以利用指数变换将域的带状区域变换到单位圆内。这就是z变换,它可以看做拉普拉斯变换的一种特殊形式,即做了一个代换,是采样频率。这个变换将信号从s域变换到z域。请注意,s域和z域表示的是同一个信号,即采样完了之后的信号,只有采样才会改变信号本身!从复平面上来看,这个变换将与轴平行的条带变换到z平面的一个单叶分支,并且将虚轴映射到单位圆。时也称作离散时间傅里叶变换(DTFT)。你会看到前面采样导致的周期延拓产生的条带重叠在一起了,因为具有周期性,所以z域不同的分支的函数值是相同的。换句话说,如果没有采样,直接进行z变换,将会得到一个多值的复变函数!所以一般只对采样完了后的信号做z变换!

 

这里讲了时域的采样,时域采样后,信号只有间的频谱,即最高频率只有采样频率一半,但是要记录这样一个信号,仍然需要无限大的存储空间,可以进一步对频域进行采样。如果时间有限(实际上这与频率受限互相矛盾,但大多数信号近似成立)的信号,那么通过频域采样(时域做周期扩展)可以不失真地从采样的信号中恢复原始信号。并且信号长度是有限的,这就是离散傅里叶变换(DFT),它有著名的快速算法快速傅里叶变换(FFT)。为什么DFT这么重要呢,因为计算机要有效地对一般的信号做傅里叶变换,都是用DFT来实现的,除非信号具有简单的解析表达式!利用上述关系,可以推导出DFT在第k个频点的值为

 

上述推导利用到两个基本公式

 

总结起来说,就是对于一个线性系统,输入输出是线性关系的,不论是线性电路还是光路,只要可以用一个线性方程或线性微分方程(如拉普拉斯方程、泊松方程等)来描述的系统,都可以通过傅里叶分析从频域来分析这个系统的特性,比单纯从时域分析要强大得多!两个著名的应用例子就是线性电路和傅里叶光学(信息光学)。甚至非线性系统,也在很多情况里面使用线性系统的东西!所以傅里叶变换才这么重要!你看最早傅里叶最早也是为了求解热传导方程(那里其实也可以看做一个线性系统)!

傅里叶变换的思想还在不同领域有很多演变,比如在信号处理中的小波变换,它也是采用一组基函数来表达信号,只不过克服了傅里叶变换不能同时做时频分析的问题。

傅里叶变换特殊的原因解释

最后,我从纯数学的角度说一下傅里叶变化到底是什么。 如果我们把函数看做向量,那么这些函数在加法和数乘两种运算下构成一个线性空间。 如果我们定义内积

 

并且限定该集合是有界函数的子集,所谓有界是指内积有界。 那么上述线性空间就是一个希尔伯特空间。这里我们忽略这些严格的泛函分析中的定义,就简单地与欧式空间中的向量和内积进行类比即可。 在这种类比下,一个函数就是一个向量。

在这种类比下(严格的证明需要用泛函分析那一套,这里我们只关注直观的图像理解),傅里叶变换就是这个向量空间中的一个幺正变换! 我们知道,欧式空间中的线性变换都可以用一个矩阵A来表示,即变换

 

表示把向量x通过变换A变换为b!傅里叶变换就把时域函数f(t)变换到频域函数F(w)! 利用傅里叶变换的基本性质,容易验证这个变换是一个幺正变换。

我们知道,线性变换的本质就是选取的基向量不同。向量的每一个坐标就是对应基向量前面的系数!

 

那么在函数空间中,基向量是什么呢?在时域基向量可以看成delta函数

 

这里的积分可以类比于前面的求和,可以类比于基向量成为基函数,f(s)可以类比于是基函数前面的系数!

同样的类比,傅里叶变换到频域选取的基函数是

 

F(w)就是基函数前面的系数。傅里叶变换就是在这两组基函数间的线性变换!

那么,问题来了,线性变换这么多,为什么傅里叶变换这么特殊?

还记得线性代数中的线性方程Ax=b吗?解这个方程的方法很多,高斯消元法是最常用的方法之一。 但是如果A是一个对角方阵,那么这个向量版的线性方程可以变为多个独立的代数方程!

 

这种情况下,很容易求得!

上述情况过于特殊,我们考虑更一般的情况,如果A是对称方阵,那么根据线性空间的特征值理论,可以找到矩阵A的所有互相正交的特征向量和特征值,然后将向量x和b表示成特征向量的组合。由于特征向量的正交关系,矩阵的代数方程可以化为n个标量代数方程

 

是不是很神奇!!一个向量版的线性方程通过重新选取了一组基向量变成多个独立的代数一次方程!

你会问这跟傅里叶变换有毛关系?别急,我们再来看非齐次线性常微分方程

 

如果把左边的线性算子部分看做线性变换,那么这个方程完全可以和上述向量版的线性方程进行类比! 把算子看做线性变换,那么我们可以采用上述类似的思路,把这个方程变成多个独立的代数方程吗? 答案是肯定的,利用该算子的特征函数作为基函数重新选取基函数即可!可以验证指数函数是该的特征函数,对应的特征值是

 

利用相似的思路,我门把函数都表示为基函数的线性组合

 

那么这样一来,前述微分方程变成了多个标量线性代数方程!

 

其实这个过程也可以看做对原始方程左右两边同时做傅里叶变换!这也是傅里叶变换求解常系数微分方程的理论基础!

在常系数线性偏微分方程中也有类似结论!例如,考虑有源的拉普拉斯方程

 

容易验证基函数(其实就是格林函数)

 

是拉普拉斯算子的特征函数!将场和源按照基函数展开,就可以将原来的拉普拉斯方程变为多个标量代数线性方程

 

上述傅里叶变换也可以用拉普拉斯变换替换,结论一样! 以上是我在上数理方程课程的时候体会到的。归纳起来,就是说傅里叶变换就是线性空间中的一个特殊的正交变换!他之所以特殊是因为指数函数是常系数微分算子的特征函数!而自然界常见的规律大多是用常系数微分方程描述,信号系统中更是常见,线性时不变系统都可以利用常系数微分方程描述,这使得傅里叶变换应用十分广泛!

其他微分算子的特征函数举例

对于常系数线性微分算子,可以用指数函数作为基函数展开,而对于变系数线性微分算子,其基函数就不再是简单的指数函数了。 但是上述思想仍然可以利用,只不过基函数是一些特殊函数,如贝塞尔函数、勒让德多项书函数等等!

所谓常系数微分算子就是具有这种形式的微分算子

 

对于变系数的微分算子,是自变量的函数,这种算子的特征函数并没有一般性的结论。 基本上每一类算子都会有自己特殊的特征函数, 这里列举几个我遇到过多次的特征函数及变系数算子。

柱坐标下的贝塞尔函数是下述微分算子的特征函数

 

球坐标下的勒让德多项式

 

它是下述微分算子的特征函数,这是一个变系数的微分算子

 

拉盖尔多项式

 

这样的例子还有很多,这些函数实际上都是一个函数族,这些函数互相正交,这和实对称阵的本征向量互相正交的性质一样,这里的线性算子也是其泛函空间上的对称轭米算子。这些函数族构成一组完备正交基,可以表达对应泛函空间中的任意函数。这和傅里叶变换的基函数——复指数函数一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

傅里叶变换公式整理,意义和定义,概念及推导 的相关文章

  • C中printf()的常用输出

    1 输出整数 xff1a d int a 61 10 printf 34 d n 34 a 2 输出无符号数 xff1a u unsigned int b 61 25 printf 34 u n 34 b 3 输出十六进制数 xff1a x
  • Cmake配置工程,管理src和include文件夹,构建最常见的工程目录结构,快速入手cmake,编写CMakeLists.txt文件

    初学CMake的时候 xff0c 常用命令就算用到很熟练 xff0c 但是对于整个工程的管理还会让我们感到吃力 我在这里分享一个常用的工程目录结构 xff0c 对于CMake还不是特别熟练的同学 xff0c 帮助大家快速上手CMake 这里
  • 01、UART串口通信

    文章目录 0 前言1 串行通信的初步认识2 RS232 通信接口3 USB 转串口通信4 IO 口模拟 UART 串口通信5 UART串口通信的基本应用5 1 通信的三种基本类型5 2 UART 模块介绍5 3 UART 串口程序 6 AS
  • USART串口总结2

    前言 xff1a 开始学USART 43 DMA 的时候看到帖子 STM32 UART DMA 实现未知数据长度接收 xff0c 觉得方法妙极了 此下出自此帖子 xff08 整体的思路是这样的 xff0c 一开始设置好DMA 接收 xff0
  • Django实战(自定义模块+Echart Tree+sqlite3)

    主要从以下这些方面依次介绍这次django实战经验 xff1a 数据处理django基本框架搭建sqlite3数据库Json数据Echart树状图Jquery 异步刷新laydate 日期查询前后端交互 数据处理 从本地文件夹中获得所有源文
  • linux内核源码下载地址

    官网链接 xff1a https www kernel org HTTPhttps www kernel org pub GIThttps git kernel org 官网下载经常速度太慢 xff0c 无法下载 xff0c 提供另一个链接
  • Android 网络基础 -- HTTP 请求过程及理解

    本文来自 图解 HTTP xff0c 相关资料与图片均来自于该书 HTTP 通信过程中 xff0c 从客户端到服务端的响应是怎么样的呢 xff1f 这一章 xff0c 我们一起来了解一下 一 HTTP 报文 用于 HTTP 协议交互的信息被
  • Intel RealSense L515&Unreal Engine 4调试记录

    文章目录 前言一 安装与配置1 安装前置条件2 配置 二 编译与运行1 编译2 运行 填坑与测试1 填坑2 测试 前言 Intel RealSense系列推出了适用于Unreal Engine 4的相关插件 xff0c 官网提供了相关示例代
  • Intel RealSense L515 motion的计算与可视化

    文章目录 前言 一 环境准备 二 具体步骤 1 示例下载 2 代码编译 3 填坑 前言 前面的文章介绍了将L515数据映射至UE当中 本篇文章将针对Intel RealSense SDK 2 0 进行姿势的计算与可视化 一 环境准备 Int
  • PELCO-D协议 要点整理

    消息格式 Byte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Sync ByteAddressCommand 1Command 2Data 1Data 2Checksum The synchronizatio
  • GTEST/GMOCK介绍与实战:Gtest Sample9

    文章目录 1 简介2 用法 1 简介 示例 9显示了使用侦听器API修改谷歌Test的控制台输出和使用其反射API来检查测试结果 2 用法 span class token comment This sample shows how to
  • Gtest输出单元测试报告和输出覆盖率报告

    文章目录 1 要求2 生成gtest测试报告3 生成gtest覆盖率报告 1 要求 编译工具 xff1a 选择Cmake xff0c 单元测试使用Gtest 2 生成gtest测试报告 gtest本身仅能输出xml或者json格式的测试报告
  • GTEST/GMOCK介绍与实战:Gtest Sample10

    文章目录 1 简介2 用法 1 简介 示例 10展示了如何使用侦听器API来实现基本内存泄漏检查 2 用法 span class token comment This sample shows how to use Google Test
  • Bitbake与Yocto

    文章目录 一 Bitbake二 Yocto 一 Bitbake xff08 1 xff09 使用教程可以参考 xff1a BitBake 实用指南 xff0c 大部分步骤跟着操作即可了解bitbake的工作流程 xff1b 他主要参考和翻译
  • 随机漫步

    span class token keyword import span numpy span class token keyword as span np span class token keyword import span rand
  • UTC时间和PTP精确时间协议

    文章目录 一 GMT二 UTC三 GMT vs UTC四 C 43 43 获得当前的UTC时间 一 GMT GMT xff08 Greenwich Mean Time xff09 xff0c 格林威治平时 xff08 也称格林威治时间 xf
  • AutoSar系列之:AutoSar发展

    文章目录 一 Autosar成员二 Autosar历史发展三 使用Autosar前的状态1 原始状态2 进阶状态 四 使用Autosar后的状态1 软硬件隔离2 Autosar优势 一 Autosar成员 二 Autosar历史发展 三 使
  • AutoSar系列之:AutoSar概述

    文章目录 一 Autosar是什么二 架构 一 Autosar是什么 RTE xff1a 用与传递应用层软件和基础软件从之间的信号的 xff1b 隔离应用软件层和基础软件层 xff1b 其中一个层修改了 xff0c 不会影响另外一个层 xf
  • Autosar系列之Appl概述

    文章目录 一 Appl的组成1 SWC通信2 SWC分配 一 Appl的组成 SWC xff1a 应用软件组件 Autosar接口 xff1a SWC之间连接的端口 Runnable xff1a 可运行实体 xff0c SWC里面的一些函数
  • Autosar系列之SWC类型

    文章目录 一 原子级SWC二 集合级SWC三 特殊的SWC 一 原子级SWC 含义 xff1a 不可拆解的SWC 二 集合级SWC eg xff1a 将相似的功能放在一起 三 特殊的SWC IoHwAb xff0c Cdd 在原有的Auto

随机推荐

  • 汽车操作系统

    文章目录 一 汽车控制器类型二 Hypervisor三 QNX Linux Andorid四 Automotive Grade Linux 系统 xff08 AGL xff09 1 介绍2 IVI市场现状3 系统构建 xff08 1 xff
  • Autosar系列之Ports类型

    文章目录 一 接口二 接口类型三 S R接口四 C S 接口 一 接口 接口是连接2个SWC通信的 二 接口类型 三 S R接口 发送 接受数据传输接口 一般通过全局变量才传递 四 C S 接口 客户 服务接口 xff1b 通过函数Runn
  • Autosar系列之Runnable可运行实体

    文章目录 一 RUnnable Entity 一 RUnnable Entity 可运行实体 xff0c 其实就是 C文件内的函数而已 一个SWC可以包含多个Runnable Entity xff0c 就是一个 C文件中可以包含多个函数 x
  • Autosar系列之RTE

    文章目录 一 RTE二 RTE功能 一 RTE RTE Run TIme Environment 是Autosar体系结构的核心 RTE是Autosar软件架构中 xff0c 介于应用层和基础软件层之间 xff0c 是Autosar虚拟功能
  • Autosar系列之Autosar应用层整体入门

    文章目录 一 整个功能示意图二 软件组件SWC分类三 SWC组件 xff1a ports1 发送 接收端口Sender Receiver2 客户端 服务端端口Client Server 四 可运行实体Runnables五 BSW1 微控制器
  • ubuntu下mysql数据库的设置

    gt su root gt mysql span class token operator span u root span class token operator span p gt show databases span class
  • Python装饰器Decorators

    文章目录 一 功能二 64 语法糖三 args kwargs四 带参数的装饰器五 类装饰器六 装饰器顺序 一 功能 装饰器本质上是一个 Python 函数或类 xff0c 它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能 xf
  • Autosar系列之Developer工具

    文章目录 一 什么是DaVinci Developer xff1f 二 DaVinci Developer Workspace三 Software Conponent xff08 SWC xff09 Design 一 什么是DaVinci
  • vscode中调试rust程序

    文章目录 一 vscode运行和调式rust程序二 常见问题1 rust Request textDocument formatting failed 2 cargo命令3 使用rust gdb调试rust程序4 cargo build太慢
  • Available-Python-Tuf

    文章目录 一 Pyhon tuf二 安装方法三 启动四 一个可用的Python Tuf 一 Pyhon tuf 1 github link 向该Pyhton tuf的repo server上传包不会持久化保存到本地 xff0c 是个demo
  • 现代C++教程2023

    文章目录 2 C 43 43 默认实参21 模板模板形参22 C 43 43 11形参包24 std nothrow25 std call once与pthread once 2 C 43 43 默认实参 21 模板模板形参 模板参数 xf
  • Python模板字符串Template

    文章目录 一 Template说明二 Python字符串替换的几种方法1 适用于变量少的单行字符串替换2 字符串命名格式化符替换3 模版方法替换 一 Template说明 1 定义字符串 根据需要 xff0c 设置字符串中需要替换的字符以
  • 聊一聊MCU的软件分层

    一 MCU级软件有必要分层吗 xff1f 1 1 如果不分层会怎样 xff1f 看下面这段示例代码 void main sys init while 1 用PA1控制LED亮灭 GPIO SetBits GPIOA GPIO Pin 1 d
  • Spring Security OAuth2.0认证授权一:框架搭建和认证测试

    一 OAuth2 0介绍 OAuth xff08 开放授权 xff09 是一个开放标准 xff0c 允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息 xff0c 而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容
  • Spring Security OAuth2.0认证授权三:使用JWT令牌

    Spring Security OAuth2 0系列文章 xff1a Spring Security OAuth2 0认证授权一 xff1a 框架搭建和认证测试Spring Security OAuth2 0认证授权二 xff1a 搭建资源
  • C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)

    C code namespace UDPServer class Program static void Main string args int recv byte data 61 new byte 1024 构建TCP 服务器 得到本机
  • 旋转矩阵与欧拉角的相互转换

    文章目录 1 概述2 详论2 1 欧拉角的理解2 2 欧拉角转旋转矩阵2 3 旋转矩阵转欧拉角 1 概述 欧拉角与旋转矩阵的相互转换 xff0c 是图形计算中的常见问题 2 详论 2 1 欧拉角的理解 表达旋转变换最简单的理解是三种旋转矩阵
  • 利用handler发送消息报:"This message is already in use"解决办法

    每天频繁的遇到问题 xff0c 解决问题 xff0c 成长不断 所以当我们遇到一个新问题要感到荣幸 xff0c 心想 xff1a 我是第一个遇到这个问题的人 xff0c 我也要成为第一个决绝这个问题的人 这样人后面都学习你的处理方法 xff
  • C语言——strcat函数(字符串拼接)

    字符串拼接strcat使用及实现 拼接 strcat 原型 char strcat char dest const char src 把src所指向的字符串 xff08 包括 39 0 39 xff09 复制到dest所指向的字符串后面 x
  • 傅里叶变换公式整理,意义和定义,概念及推导

    看到论坛有一个朋友提问为什么傅里叶变换可以将时域变为频域 xff1f 这个问题真是问到了灵魂深处 在这我只能简单讲讲我的理解 xff0c 要深刻理解翻信号处理教科书是最好的方法 1 如何描述信号 我们常常用数学模型去抽象物理事件 信号也可以