matlab ,FFT频谱分析,怎样将频谱分析振幅转为真实振幅,

问题描述:

matlab ,FFT频谱分析,怎样将频谱分析振幅转为真实振幅,
对fft分析只略懂皮毛,毕业论文要用到一章,我需要将检测到的地震信号从时域转到频域,也就是本来横坐标为时间,纵坐标为幅值,转为横坐标为频率,纵坐标为真实幅值.我照猫画虎写了一个程序,可是幅值不是真实幅值,程序如下,采样率为4000.,采集数据16384个,求高手帮我看看,看哪里要改一下,附件有保存数据的csv文件
clf;
x=csvread('bp2.csv');
x=x(:,1);
x=x';
plot(x)
figure
y=fft(x,16384); %对信号进行快速Fourier变换
mag=abs(y); %求得Fourier变换后的振幅
f=(0:16383)*4000/16384; %频率序列
plot(f(1:8192),mag(1:8192)*2/8192); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
1个回答 分类:综合 2014-12-13

问题解答:

我来补答
没有下载你的附件,下面是我自己的经验,虽然原理也不太清楚,如果有说错的大虾补充,不过结果没有大问题,举个简单的例子吧.
假设我们有个时间序列
t=0:0.01:5;
a=sin(2*pi*t)+sin(6*pi*t);
画出来看看
plot(t,a);
这个信号在谱空间应该有两个峰值,分别对应频率1和3,峰值大小都是1.
n=length(t); % length of signal
x=fft(a)/n; % normalized fft
f=(0:n-1)/t(end); % corresponding frequency
画出结果
bar(f,abs(x));
会看到关于中心轴对称的图像.这是因为这样求出来的是双侧谱,频率是有正有负,但是我们一般只关心正频率.所以我们要截断一半.
cutoff=floor(n/2); % cut into two halves
bar(f(1:cutoff),2*abs(x(1:cutoff)));% plot
xlim([0 f(cutoff)]);
这个地方乘以2的原因如上所述已经可以猜到了,原本的能量在正负频率都有分布,但是因为只截取了正频率,所以负频率的能量损失掉了,因此要将谱折叠过来,所有振幅都乘以2就是了.
放大关心的部分看看
xlim([0 4]);
 
 
展开全文阅读
剩余:2000
下一页:生物 酶