matlab Yfft(X)Yfft(X,n

2020-12-09 10:15:51 字数 5363 阅读 3489

1楼:半岛向北

x为信号,n为变换点数。

y = fft(x) 是对信号x进行

快速傅里叶变换;

y = fft(x,n)就是对信号x的前n个点进行快速傅里叶变换,如果n大于x的点数,则直接取前n个点,若小于n,则x先进行补零扩展为n点序列再求n点fft。

一般情况下,n要取最接近x长度的2的整数幂,这样可以实现更快的fft,提高计算效率。

matlab中进行fft谱分析,如何将频谱图的横坐标转换成频率?

2楼:匿名用户

[x,fs,bite]=wavread('c:\windows\media\windows xp 启动.wav',[1000 1499]);

z=x(:,1);

y=fft(z);

y=fftshift(x);

sound(x,fs,bite);

subplot(2,1,1);plot(abs(y));

将零频分量移至频谱中心的函数

格式:y=fftshift(x)

功能:用来重新排列x=fft(x)的输出,把x 的左右两半进行交换,从而将零频分量移至频谱中心。

3楼:杨好巨蟹座

一.调用方法

x=fft(x);

x=fft(x,n);

x=ifft(x);

x=ifft(x,n)

用matlab进行谱分析时注意:

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

例:n=8;

n=0:n-1;

xn=[4 3 2 6 7 8 9 0];

xk=fft(xn)

→xk =

39.0000 -10.7782 + 6.

2929i 0 - 5.0000i 4.7782 - 7.

7071i 5.0000 4.7782 + 7.

7071i 0 + 5.0000i -10.7782 - 6.

2929i

xk与xn的维数相同,共有8个元素。xk的第一个数对应于直流分量,即频率值为0。

(2)做fft分析时,幅值大小与fft选择的点数有关,但不影响分析结果。在ifft时已经做了处理。要得到真实的振幅值的大小,只要将得到的变换后结果乘以2除以n即可。

二.fft应用举例

例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。采样频率fs=100hz,分别绘制n=128、1024点幅频图。

clf;

fs=100;n=128; %采样频率和数据点数

n=0:n-1;t=n/fs; %时间序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号

y=fft(x,n); %对信号进行快速fourier变换

mag=abs(y); %求得fourier变换后的振幅

f=n*fs/n; %频率序列

subplot(2,2,1),plot(f,mag); %绘出随频率变化的振幅

xlabel('频率/hz');

ylabel('振幅');title('n=128');grid on;

subplot(2,2,2),plot(f(1:n/2),mag(1:n/2)); %绘出nyquist频率之前随频率变化的振幅

xlabel('频率/hz');

ylabel('振幅');title('n=128');grid on;

%对信号采样数据为1024点的处理

fs=100;n=1024;n=0:n-1;t=n/fs;

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号

y=fft(x,n); %对信号进行快速fourier变换

mag=abs(y); %求取fourier变换的振幅

f=n*fs/n;

subplot(2,2,3),plot(f,mag); %绘出随频率变化的振幅

xlabel('频率/hz');

ylabel('振幅');title('n=1024');grid on;

subplot(2,2,4)

plot(f(1:n/2),mag(1:n/2)); %绘出nyquist频率之前随频率变化的振幅

xlabel('频率/hz');

ylabel('振幅');title('n=1024');grid on;

运行结果:

fs=100hz,nyquist频率为fs/2=50hz。整个频谱图是以nyquist频率为对称轴的。并且可以明显识别出信号中含有两种频率成分:

15hz和40hz。由此可以知道fft变换数据的对称性。因此用fft对信号做谱分析,只需考察0~nyquist频率范围内的福频特性。

若没有给出采样频率和采样间隔,则分析通常对归一化频率0~1进行。另外,振幅的大小与所用采样点数有关,采用128点和1024点的相同频率的振幅是有不同的表现值,但在同一幅图中,40hz与15hz振动幅值之比均为4:1,与真实振幅0.

5:2是一致的。为了与真实振幅对应,需要将变换后结果乘以2除以n。

例2:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t),fs=100hz,绘制:

(1)数据个数n=32,fft所用的采样点数nfft=32;

(2)n=32,nfft=128;

(3)n=136,nfft=128;

(4)n=136,nfft=512。

clf;fs=100; %采样频率

ndata=32; %数据长度

n=32; t的数据长度

n=0:ndata-1;t=n/fs; %数据对应的时间序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %时间域信号

y=fft(x,n); %信号的fourier变换

mag=abs(y); %求取振幅

f=(0:n-1)*fs/n; %真实频率

subplot(2,2,1),plot(f(1:n/2),mag(1:n/2)*2/n); %绘出nyquist频率之前的振幅

xlabel('频率/hz');ylabel('振幅');

title('ndata=32 nfft=32');grid on;

ndata=32; %数据个数

n=128; %t采用的数据长度

n=0:ndata-1;t=n/fs; %时间序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y=fft(x,n);

mag=abs(y);

f=(0:n-1)*fs/n; %真实频率

subplot(2,2,2),plot(f(1:n/2),mag(1:n/2)*2/n); %绘出nyquist频率之前的振幅

xlabel('频率/hz');ylabel('振幅');

title('ndata=32 nfft=128');grid on;

ndata=136; %数据个数

n=128; t采用的数据个数

n=0:ndata-1;t=n/fs; %时间序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y=fft(x,n);

mag=abs(y);

f=(0:n-1)*fs/n; %真实频率

subplot(2,2,3),plot(f(1:n/2),mag(1:n/2)*2/n); %绘出nyquist频率之前的振幅

xlabel('频率/hz');ylabel('振幅');

title('ndata=136 nfft=128');grid on;

ndata=136; %数据个数

n=512; t所用的数据个数

n=0:ndata-1;t=n/fs; %时间序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y=fft(x,n);

mag=abs(y);

f=(0:n-1)*fs/n; %真实频率

subplot(2,2,4),plot(f(1:n/2),mag(1:n/2)*2/n); %绘出nyquist频率之前的振幅

xlabel('频率/hz');ylabel('振幅');

title('ndata=136 nfft=512');grid on;

结论:(1)当数据个数和fft采用的数据个数均为32时,频率分辨率较低,但没有由于添零而导致的其他频率成分。

(2)由于在时间域内信号加零,致使振幅谱中出现很多其他成分,这是加零造成的。其振幅由于加了多个零而明显减小。

(3)fft程序将数据截断,这时分辨率较高。

(4)也是在数据的末尾补零,但由于含有信号的数据个数足够多,fft振幅谱也基本不受影响。

对信号进行频谱分析时,数据样本应有足够的长度,一般fft程序中所用数据点数与原含有信号数据点数相同,这样的频谱图具有较高的质量,可减小因补零或截断而产生的影响。

例3:x=cos(2*pi*0.24*n)+cos(2*pi*0.26*n)

(1)数据点过少,几乎无法看出有关信号频谱的详细信息;

(2)中间的图是将x(n)补90个零,幅度频谱的数据相当密,称为高密度频谱图。但从图中很难看出信号的频谱成分。

(3)信号的有效数据很长,可以清楚地看出信号的频率成分,一个是0.24hz,一个是0.26hz,称为高分辨率频谱。

可见,采样数据过少,运用fft变换不能分辨出其中的频率成分。添加零后可增加频谱中的数据个数,谱的密度增高了,但仍不能分辨其中的频率成分,即谱的分辨率没有提高。只有数据点数足够多时才能分辨其中的频率成分。

4楼:匿名用户

你要先能确定你在进行**时用的fs,还有fft时的位数n,也即你做完fft后,信号y的长度。n=length(y),然后可以由ff=[0:n-1]*fs/n来确定频率分布,把它作为横轴。

画图时用

plot(ff,abs(y))即可。

matlab中fft函数的疑问

5楼:匿名用户

n要取最接近数据长度的2的整数次方,命令是2^nextpow2(n),其中n是实际数据长度,因为这样的n可以使fft更快。比如,n=1021,执行n=2^nextpow2(n)后,n=2^10=1024。而你说的512也是这个道理。

f为表示频率的横轴,它的长度必须和abs(y)的长度相等,它们都是在图形上显示的长度。比如,f显示n的一半,abs(y)也要取n的一半:plot(f(1:

n/2),y(1:n/2)),其中y=abs(y)。

注意:做fft的数据长度是整个的数据长度,plot显示的长度可以任取。

matlab中x ones(1,n),以及q zeros

1楼 随便什么名啦啦 x ones 1 n 表示x为全0数组 q zeros 1 n 表示q为全0数组 n length a 表示获得数组a的最大维度。 1 数组的维数 在matlab中,允许标量数据沿行 列 页等方向排列成 长方体 ,而构成数组,而行 列 页等排列方向就分别被 称为行维 列维和页维...

matlab里xx.2什么意思,matlab中f=@(x)x^2; 什么意思?

1楼 匿名用户 xx是数组 2是平方 xx 2就是数组的每个元素的平方 然后赋值给y 2楼 匿名用户 xx应该是数组 2是平方 matlab中f x x 2 什么意思 3楼 匿名用户 是函数句柄的符号 这句话的意思就是说 f 是关于 x 的函数 后边是函数的表达式 即 f x x 2 4楼 风雨之中...

已知集合M x y 2?x,集合N y y x2-2x

1楼 丶舞所遁形 由m , n m n 故选 c 已知集合m y y x 2 1,x r , n x y 2 x 2 ,则m n a 1, 2楼 手机用户 集合m , 对于n ,2 x2 0,解得 2 x 2 ,n , 则m n 1, 2 , 2 1, 2 故选b 已知集合m x x x2,x r ...