在进入小波分析之前,我们首先要做的事情就是搞清楚傅里叶变换,很多教材、视频中讲解小波分析都会提到傅里叶变换,那么他们到底有什么关系呢?,看完这篇文章我相信你一定还是不会明白(哈哈哈哈,没想到吧,你没看错,不会明白!!!)因为我会出一个系列(专栏),专门讲解小波分析及其应用,这是专栏的第一篇文章,所以大家别着急,我们慢慢道来......
1.傅里叶变换介绍
首先,咱们先来看看一维的傅里叶变换:官方给出的定义:傅立叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。最初傅立叶分析是作为热过程的解析分析的工具被提出的。
尽管最初傅里叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。"任意"的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类,这一想法跟化学上的原子论想法何其相似!奇妙的是,现代数学发现傅里叶变换具有非常好的性质,使得它如此的好用和有用,让人不得不感叹造物的神奇:
-
傅里叶变换是线性算子,若赋予适当的范数,它还是酉算子;
-
傅里叶变换的逆变换容易求出,而且形式与正变换非常类似;
-
正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;
-
著名的卷积定理指出:傅里叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;
-
离散形式的傅里叶变换可以利用数字计算机快速的算出(其算法称为快速傅里叶变换算法(FFT)).
正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。
在b站有一个我觉得是世界上讲的最形象最易懂的傅里叶变换的视频,大家可以参考着看一下:
傅里叶变换的应用涵盖了概率与统计、信号处理、量子力学和图像处理等学科。
2.傅里叶变换公式
离散傅里叶变换的公式如下:
在MATLAB中,可以直接使用函数库fft(X)对一维向量X做傅里叶变换,分析信号的组成。如下例子处理一维离散信号
3. 信号分析
通过傅里叶变换,可以将实变信号f(t)分解成各个频率分量的线性叠加,进而从频率的角度研究信号的组成。
来看这个杂乱无章的曲线图,你是否能看出它的规律?
Figure 1 What's the law of the signal?
让我们来对它做一维离散傅里叶变换,得到下图:
Figure 2 The Fourier Transform of the signal in the figure 1
从图2的傅里叶变换中我们可以观察到信号在频率为50Hz和120Hz的地方有峰值,表明了原信号主要由频率为50Hz和120Hz的三角函数信号组成。
上面例子的具体MATLAB代码如下:
clear
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
S = 0.9*sin(2*pi*50*t) + 1.8*sin(2*pi*120*t); %standard signal
X = S + 1*randn(size(t)); %there are some noise mixing in the signal.
Y = fft(X); % Fourier Transform of the signal
f = 1:L/2; % the frequence of label
% half of Y is enough to show the information.
Y = Y./L*2; % calculate the amplitude of Fourier Transform of the signal
%draw the curve
figure(1);
plot(t,X); % show the original signal
xlabel('时间')
ylabel('振幅')
figure(2);
plot(f,abs(Y(1:L/2)));% show the Fourier Transform of the signal
xlabel('Hz');
ylabel('振幅');
傅里叶变换可以把信号的振动频率分离出来,我们可以通过设置不同频率分量前的系数,可实现信号的滤波。
如含有噪声的信号:
Figure 3 signal mixing with noise
将该信号进行傅里叶变换,然后使得高频信号的系数为零,再傅里叶反变换回原信号,可得到滤波后的结果:
Figure 4 signal after filtering
要注意的是,要想使用好傅里叶变换,必须对傅里叶变换有较为深入的了解,比如上面的滤波中,如果设置滤波频率的界限不同,那么其滤波效果也不同;还要注意的是,傅里叶变换后的信号具有周期性,其数据关于中心位置对称,所以滤波界限要关于中心对称;上例中具体实现代码如下:
clear
Fs = 1000;
T = 1./Fs;
L = 1000;
t = (0:L-1)*T;
S = 2*cos(2*pi*2*t)+3*sin(2*pi*4*t); %standard signal without the noise
X = S+0.3*randn(size(t)); %signal mixing with noise
figure(1);
plot(t,X);
title('signal mixing with noise');
xlabel('time');
ylabel('amplitude');
Y1 = fft(X); %fourier transform
threadhold = 30; %setting the filtering threadhold
Y1(threadhold:(L-threadhold)) = 0; %filtering
X1 = ifft(Y1); %Inverse Fourier transform
figure(2);
plot(t,X1);
title('signal after filtering');
xlabel('time');
ylabel('amplitude');
4.实战
4.1 离散傅里叶变换的实现
在MATLAB中x(n)=sin(npi/8)(N为20)离散傅里叶变换的实现:
clear all
close all
N=16; %序列长度
n=0:N-1; %时域取样
xn=sin(pi*n/4); %产生序列
k=0:N-1; %频域取样
wn=exp(-j*2*pi/N);
nk=n'*k;
wnnk=wn.^nk;
xk=xn*wnnk %计算DFT
figure(1)
stem(n,xn)
%画图
figure(2)
stem(k,abs(xk))
运行结果如下:
4.2 利用快速傅里叶变换FFT进行正弦信号波的计算
接下来,利用快速傅里叶变换FFT进行正弦信号波的计算,并画出频率与相位图:
t = (0:99)/100; % 时间向量
x = sin(2*pi*15*t) + sin(2*pi*40*t); % 正弦信号波
y = fft(x); %调用快速傅立叶变换函数
p = unwrap(angle(y)); %相位
f = (0:length(y)-1)'/length(y)*100; % 频率向量
figure(1)
plot(f,p)
4.3 计算线性卷积
设x(n)长度为N1,h(n)长度为N2,计算两者的线性卷积:
43x=[5,2,3,8,9,1];
h=[8,2,4,1,5,8,2,3,9,5];
lenx=length(x);
lenh=length(h);
N=lenx+lenh-1;
xk=fft(x,N);
hk=fft(h,N);
yk=xk.*hk;
y=real(ifft(yk));
plot(y);
xlabel('n');
ylabel('y(n)');
title('x(n)*h(n)');
grid
结果如下:
这就是一维的傅里叶变换及其应用,更详细的资料很多博客写的更好,大家可以参考: