首页 > 编程知识 正文

fft matlab实现(matlab中fft函数求相位)

时间:2023-05-03 20:04:46 阅读:72567 作者:4891

在用离散傅立叶变换(DTF )算法运算快速傅立叶变换(Fast Fourier transform,FFT )情况下,复数乘法执行电路、复数加法执行电路和计算量实际上可以通过FFT减小. 1965年,首先由Cooley-Tukey提出了基-2FFT算法,对DFT的发展起到了很大的推动作用。 之后,出现了混合算法。 fft是一种计算DTF的快速算法,利用因子的周期性、共轭对称性、可约性。

1、fft算法主要有以下三种时域提取基-2FFT算法(Decimation -In- Time,DIT-FFT ) :

频域抽取基-2FFT算法(Decimation-In-Freqency,DIF-FFT ) ) ) ) ) ) ) ) ) ) )。

序列长度n可以表示为合数的FFT算法(混合基)

2、fft函数(matlab帮助文档: https://WW2.mathworks.cn/help/MATLAB/ref/FFT.html? 搜索高亮度=ffts _ tid=doc _ srch title )

y=FFT(x ) y=FFT(x,n ) y=FFT(x,n,dim ) ) ) ) ) ) 652 )

2.1y=用FFT (x ) ——快速傅立叶变换(FFT )算法计算x的离散傅立叶变换(DFT )。

如果x是向量,则FFT(x )返回该向量的傅立叶变换。

如果x是矩阵,则FFT(x )将x中的每一列视为向量,并返回每一列的傅立叶变换。

如果x是多维数组,则FFT(x )将沿第一个大小不为1的数组维的值视为向量,并返回每个向量的傅立叶变换。

2.2y=FFT(x,n ) ——返回n点的DFT。 如果不指定值,则y的大小与x相同。

如果x是向量并且x的长度小于n,则x加上末尾的零到达长度n。

如果x是向量,x的长度大于n,则x将被截断为长度n。

x为矩阵时,各列的处理与向量时相同。

如果x是多维数组,则第一个大小不等于1的数组维的处理方式与向量的处理方式相同。

2.3y=FFT(x,n,dim ) ——返回沿着维度dim的傅立叶变换。

如果x是矩阵,则FFT(x、n、2 )返回每行的n点傅立叶变换。

具体的例子在官方文档中。 在此说明fft函数的特征。

1 .函数fft返回值的数据结构具有对称性

根据采样定理,fft可以识别的最高频率是采样频率的一半,即Nyquist频率。 函数fft的返回值以Nyqusit频率为轴对称,y的前半部分和后半部分呈复共轭关系,信息实际上是重复的。 因此,进行n点的fft时,实际有用的分数为n 1点(无论n是奇数还是偶数,有用的分数都相同)。

fn=(n-1 ) * Fs /N

Fn是第n个点表示的真实频率值。 当然,n只取前一半的点就足够了。 这样,可以达到的频率分辨率是Fs/N。

2 .振幅

当进行FFT分析时,振幅的大小与输入点数有关。为了获得实际的振幅的大小,需要将变换后的结果除以n。 同样,由于零频率不是在双边频谱中平分的,所以真正的频率幅度是在除零频率之外的点上再乘以2而获得的。

y=FFT(x; % X表示信号P2=ABS(y/L ); %计算双侧谱p2p1=l*p2(1:l/21 ); 将%p2的前半个信号分配给P1。 P1是感兴趣的部分p1(2:end-1 )=2*p1 ) 23360end-1 )。 % 0频率以外的信号乘以23 .基频

设分析数据时间长度为t,则分析结果的基频为f0=1/T,分析结果的频率序列为[0:N

-1]*f0

4.  执行N点FFT

在调用格式 2.2 中,函数执行N点FFT。若y为向量且长度小于N,则函数将y补零至长度N,若向量y的长度大于N,则函数截断y使之长度为N。由于fft算法的本质,对于N的选取一般为大于序列长度点数的最小2的幂次方,这样能改善 fft 的计算性能。

N = 2^nextpow2(L); % 将无限的钢笔脉冲转换为频域Y = fft(X,N);

而如果未制定进行fft的点数N,默认产生的结果为N点,默认进行的fft便是基于混合基来进行计算的,性能当然不会优于基2。

3、fftshift函数

官方文档:

https://ww2.mathworks.cn/help/matlab/ref/fftshift.html

fftshift的功能是将零频分量移到频谱中心。怎么理解这句话呢?fft计算得到的频域信号的频率区间是0~Fs(Fs是采样频率)的,且关于Fs/2对称。称0~FS为数字频率,对应模拟角频。但是我们只关心区间,fftshift函数的功能就是将fft处理之后的部分搬移至,从而使零频分量居于频谱的中心位置。

 

Y = fftshift(X) 通过将零频分量移动到数组中心,重新排列傅里叶变换 X。

如果 X 是向量,则 fftshift 会将 X 的左右两半部分进行交换。

如果 X 是矩阵,则 fftshift 会将 X 的第一象限与第三象限交换,将第二象限与第四象限交换。

如果 X 是多维数组,则 fftshift 会沿每个维度交换 X 的半空间。

 

Y = fftshift(X,dim) 沿 X 的维度 dim 执行运算。例如,如果 X 是矩阵,其行表示多个一维变换,则 fftshift(X,2) 会将 X 的每一行的左右两半部分进行交换。

注意:fftshift 没有fft的功能,是在 fft 之后进行的(有需要的话)。

运行代码:

% fftshiftfs = 100; % sampling frequencyt = 0:(1/fs):(10-1/fs); % time vectorS = cos(2*pi*15*t);n = length(S);X = fft(S);f = (0:n-1)*(fs/n); %frequency rangepower = abs(X).^2/n; %powersubplot(121);plot(f,power)xlabel('f');Y = fftshift(X);fshift = (-n/2:n/2-1)*(fs/n); % zero-centered frequency rangepowershift = abs(Y).^2/n; % zero-centered powersubplot(122);plot(fshift,powershift)xlabel('f');

得到如下的结果:

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。