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 ...