引言
如果你对牛顿晚年为何那么坚定不移的信奉上帝感到疑惑,那研究下傅里叶分析就能或多或少的体会到科学巨匠们对自然规律的敬畏和困惑,那种对称之美确实让人不禁怀疑自然法则是由所谓的造物主制定的,不然看似混杂的现象怎么都暗含精妙的内在规律,科技发展到今天我们已经不怎么在意造物主是否存在了,小平同志的科技是第一生产力的论述更是在中国褪去了曾经笼罩在科技身上长久不去东方的“奇技淫巧”和西方的神学外衣,科技作为构建人类理想社会以及提升人类福祉的手段愈发的充斥着实用色彩。
傅里叶分析方法在工程领域属于通信技术的范畴,用来构建通信信号和通信系统对应时域和频域的特性联系,可以说如果没有傅里叶分析就没有现代意义上的通信技术,因为通信技术的发展与人类对频域或者说复频域的认知程度息息相关,类似于其他我们日常感官不到的领域技术一样,频域对任何人来说都是看不到摸不着的,这也造就了傅里叶分析方法理论的艰深,特别是通过严谨的数学公式推导论证出来的结论,很难让没有感性认识的人理解接受并用来指导实践,而我虽然是通信专业但确实又看公式头大因此深感其痛苦,由此我想全以论述的方式来解释我理解的傅里叶分析。
一、信号与系统分类
从时域的角度来看信号有***时间、幅值坐标轴(时间函数)***描述
从时域的角度来看系统有***时间、幅值坐标轴(单位冲激响应特性)***描述
从频域的角度来看信号有***幅值、频率坐标轴(幅频特性)***和***相位、频率坐标轴(相频特性)***描述
从频域的角度来看系统有***幅值、频率坐标轴(幅频特性)***和***相位、频率坐标轴(相频特性)***描述
从时域描述上来看,信号可分为:
连续/模拟信号 - 信号时间、幅值均连续
离散/采样信号 - 信号时间离散、幅值连续
数字/量化信号 - 信号时间、幅值均离散
在实际工程中,离散/采样信号仅作为模数转换的过渡信号形式不会在其他信号处理过程中使用,由此系统便以处理另外两种形式信号作为划分依据。
从时域描述上来看,系统可分为:
连续系统 - 单位冲激响应特性曲线h(t)
时间连续,输入输出模拟信号
离散系统 - 单位冲激响应特性曲线h(n)
时间离散,输入输出数字信号
注意:默认离散信号即指数字信号,实质上离散信号如果考虑采样频率对应到时间轴可以看做特殊的模拟信号。
由此分别划分并定义了信号、系统的连续和离散两种类型的时域描述,但无论是理论分析还是工程实践都需要构建对应的信号、系统的频域描述,为此需要一套分析方法来建立相应类型的时频联系。
二、傅里叶分析
前提论断:
1.傅里叶分析中构建的时域描述是负无穷到正无穷的时幅变化,即稳定的频域描述对应稳定无穷时间的时域描述。
2.只有系统可以具有稳定无穷时间的时域描述,即具有稳定的频域描述(频谱);工程实践中信号只有在符号周期内才具有有限时间内稳定的时域描述,也即信号的频域描述随着符号周期的变化而变化,在不同符号周期内有不同的稳定描述。
3.理论分析和工程实践中均假定时域上信号具有周期性,系统具有非周期性;实践中往往将有限长信号假定周期延拓为周期信号。
傅里叶分析变换对:
时域 <-> 频域 <-> 变换类型
连续非周期 <-> 非周期连续 <-> 傅里叶变换
连续周期 <-> 非周期离散 <-> 傅里叶级数
离散非周期 <-> 周期连续 <-> 序列的傅里叶变换
离散周期 <-> 周期离散 <-> 离散傅里叶变换/离散傅里叶级数
由此可得傅里叶变换的重要规律:
时频对应中均满足***连续 <-> 非周期*** 和 离散 <-> 周期
联系前提论断可以将傅里叶变换对拓展至对应信号和系统类型:
时域 <-> 频域 <-> 变换类型 <-> 信号/系统类型
***连续非周期h(t) <-> 非周期连续H(jw) <-> 傅里叶变换 <-> 连续系统 ***
连续周期f(t) <-> 非周期离散 <-> 傅里叶级数 <->连续信号
离散非周期h(n) <-> 周期连续H(e^jw) <-> 序列的傅里叶变换 <-> 离散系统
离散周期x(n) <-> 周期离散 <-> 离散傅里叶变换/离散傅里叶级数 <-> 离散信号
经典规律:
1.对信号时域采样即对信号时域的离散化,势必造成信号频域的周期化,即连续信号到离散信号频谱的变化规律;频域周期化的周期即采样频率。
2.连续系统的频域描述具有非周期性质,即高低带通均对无穷频域而言;离散系统的频域描述具有周期性质,即高低带通均对各个频域周期内而言。
3.使用连续系统的低通滤波特性可以仅保留一个周期内的离散信号频谱,由此将离散信号还原成连续信号;也可以使用升余弦滤波器对离散信号进行脉冲成形(内插)变成抗码间干扰的连续基带信号。
4.假定有限长序列在时域上周期延拓,离散傅里叶变换即求该周期序列的频域描述;因周期序列的频域描述为周期,所以只需求出某周期内频域描述周期延拓即可;离散傅里叶变换本质上即对有限长序列的傅里叶变换周期内N
点等间隔采样。
5.DFT/FFT
原理:
有限长信号时间T
-> 采样频率fs
-> 采样周期Ts=1/fs
-> 离散序列个数N=T*fs=T/Ts
对N
点周期内序列做N
点DFT
-> 频域分辨率df=fs/N=1/T
& 频域坐标-fs/2:df:fs/2-df
工程上为了计算效率使用FFT
算法实现DFT
,FFT
计算出的原始N
点频域描述正负频轴颠倒,将N
点数据划分为两组(1:1:N/2)
、(N/2+1:1:N)
,则实际频率对应为:(1:1:N/2) <-> (0:df:(N/2-1)*df)
、 (N/2+1:1:N) <-> (-N/2*df:df:-df)
;在matlab
中使用函数fftshift
实现该转换。
实际中的“频谱泄露”:
1.周期内信号各主频分量幅相的跳变会引发相应过渡性高低阶谐波能量;该系列谐波能量由信号源辐射,用以过渡各主频分量幅相的跳变;如部分高低阶谐波被滤波器过滤则对应主频分量的跳变将较为平滑实现。
2.周期内各幅相跳变的主频分量以及各对应的过渡性高低阶谐波均化到频谱,即形成代表各主频分量的主谱线和代表各对应过渡性高低阶谐波的旁瓣;即旁瓣用来描述对应主频分量在周期内的幅相跳变。
3.周期内各主频分量跳变波形累加即可得到原始周期波形。
三、实际中频谱分析
连续信号的频域只有理论分析的价值,在实际中应用的都是离散傅里叶变换。
将有限长T
的连续信号假定为周期时长T
的连续信号通过采样频率fs
获得周期内离散序列,即可通过离散傅里叶变换求出周期fs
内的频域描述,在根据已知的采样频率fs
和信号周期时长T
便可得到假定周期离散信号的周期性离散频谱,又知频域的非周期化会导致时域的连续化,所以取零频附近的单周期频谱对应的就是假定周期化的连续信号。
clear all
close all
T = 2
ts = 0.001
t = 0:ts:T-ts
fs = 1/ts
df = fs/length(t)
f = -fs/2:df:fs/2 -df
y1 = sin(2* pi * 5* t )
y2 = sin(2 * pi * 80 *t )
ytmp = y1 + 2 * y2
ytmp1 = [y1(1:length(t)/2) y2(length(t)/2+1:end)]
y11 = y1 + 2*y2
y22 = 2 * y1 + y2
ytmp2 = [y11(1:length(t)/2) y22(length(t)/2+1:end)]
subplot(3,1,1)
plot(t, y1)
subplot(3,1,2)
plot(t, ytmp1)
subplot(3,1,3)
plot(t, ytmp2)
pam1 = fftshift(fft(y1)/fs)
%pam2 = fftshift(fft(ytmp1)/fs)
pam2_1 = fft(ytmp1)/fs
pam2_1(15:end-15) = 0
pam2 = fftshift(pam2_1)
ytest201 = ifft(pam2_1)*fs
pam2_1_1 = fft(ytmp1)/fs
ytest1 = ifft(pam2_1_1)*fs
% pam3 = fftshift(fft(ytmp2)/fs)
pam3_1 = fft(ytmp2)/fs
pam3_1(15:end-15) = 0
pam3 = fftshift(pam3_1)
ytest301 = ifft(pam3_1)*fs
pam3_1_1 = fft(ytmp2)/fs
ytest2 = ifft(pam3_1_1)*fs
figure
subplot(2,1,1)
plot(real(ytest201))
subplot(2,1,2)
stem(f,abs(pam2))
figure
subplot(2,1,1)
plot(ytest1)
subplot(2,1,2)
stem(f,abs(fftshift(pam2_1_1)))
figure
subplot(2,1,1)
plot(real(ytest301))
subplot(2,1,2)
stem(f,abs(pam3))
figure
subplot(2,1,1)
plot(ytest2)
subplot(2,1,2)
stem(f,abs(fftshift(pam3_1_1)))
% real_pam1 = real(pam1)
% image_pam1 = imag(pam1)
% for count = 1:length(pam1)
% if abs(real_pam1(count)) < 0.1
% real_pam1(count) = 0;
% end
% if abs(image_pam1(count)) < 0.1
% image_pam1(count) = 0;
% end
% pam1_f(count) = real_pam1(count) + image_pam1(count)*j;
% end
%
% real_pam2 = real(pam2)
% image_pam2 = imag(pam2)
% for count = 1:length(pam2)
% if abs(real_pam2(count)) < 0.1
% real_pam2(count) = 0;
% end
% if abs(image_pam2(count)) < 0.1
% image_pam2(count) = 0;
% end
% pam2_f(count) = real_pam2(count) + image_pam2(count)*j;
% end
%
% real_pam = real(pam)
% image_pam = imag(pam)
% for count = 1:length(pam1)
% if abs(real_pam(count)) < 0.1
% real_pam(count) = 0;
% end
% if abs(image_pam(count)) < 0.1
% image_pam(count) = 0;
% end
% pam_f(count) = real_pam(count) + image_pam(count)*j;
% end
%
% figure
% stem(f, angle(pam1_f)/pi)
% grid on
% figure
% stem(f, angle(pam2_f)/pi)
% grid on
% figure
% stem(f, angle(pam_f)/pi)
% grid on