FFT原理及应用

傅立叶变换其实只是众多数学变化中的一种,但却是应用最广泛的一种。其实质是将一个周期函数分解成一系列正交函数的(比如sin和cos函数)的线性集合。在计算机处理中需要将其离散化,编程DFT算法。在继电保护应用中又分为半周DFT和全周DFT,递归DFT算法等。在进行DFT前物理上需要将高于采样频率一半的高频信号过滤掉,在数字上需要数字滤波器过滤掉其他高频干扰,防止频率混叠。

傅立叶变换是整个时间域上的变换,而DFT将其截断,相当于乘以矩形窗函数,而时域上的乘积相当与频域上的卷积,翻过拉依然。因此不可避免地存在频谱泄漏和阑珊效应。又由于电力系统中周期总是在工频附近摆动,没有办法做到每个周期都正好是整数倍的采样,这样更加剧了频谱泄漏和栏珊效应。

快速傅里叶变换将时域中难以处理的信号转换成易于处理的频域信号,分析完成后进行傅里叶反变换即得到原始的时域信号。需要注意区分的是FFT算法针对一个已经测量好的数字序列进行处理,是DFT的一种快速算法,通过蝶形运算利用正交函数特性大大提高了运算速度;而递归DFT算法则是每测量一个点都计算一次。或者可以这么理解:FFT是离线式的计算,而递归DFT则是在线式的。在网上搜了一下,将有用信息放到此处,以便学习。

 

 

%*************************************************************************%
%                              FFT实践及频谱分析                          %
%*************************************************************************%
%***************1.正弦波****************%
fs=100;%设定采样频率
N=128;
n=0:N-1;
t=n/fs;
f0=10;%设定正弦信号频率
x=sin(2*pi*f0*t); %生成正弦信号
figure(1);
subplot(231);
plot(t,x);%作正弦信号的时域波形
xlabel('t');
ylabel('y');
title('正弦信号y=2*pi*10t时域波形');
grid;
%进行FFT变换并做频谱图
y=fft(x,N);%进行fft变换
mag=abs(y);%求幅值
f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换
figure(1);
subplot(232);
plot(f,mag);%做频谱图
axis([0,100,0,80]);
xlabel('频率(Hz)');
ylabel('幅值');
title('正弦信号y=2*pi*10t幅频谱图N=128');
grid;
%求均方根谱
sq=abs(y);
figure(1);
subplot(233);
plot(f,sq);
xlabel('频率(Hz)');
ylabel('均方根谱');
title('正弦信号y=2*pi*10t均方根谱');
grid;
%求功率谱
power=sq.^2;
figure(1);
subplot(234);
plot(f,power);
xlabel('频率(Hz)');
ylabel('功率谱');
title('正弦信号y=2*pi*10t功率谱');
grid;
%求对数谱
ln=log(sq);
figure(1);
subplot(235);
plot(f,ln);
xlabel('频率(Hz)');
ylabel('对数谱');
title('正弦信号y=2*pi*10t对数谱');
grid;
%用IFFT恢复原始信号
xifft=ifft(y);
magx=real(xifft);
ti=[0:length(xifft)-1]/fs;
figure(1);
subplot(236);
plot(ti,magx);
xlabel('t');
ylabel('y');
title('通过IFFT转换的正弦信号波形');
grid;

你可能感兴趣的:(编程,算法,fft,plot)