(高分求助)用Matlab,怎么用FFT变换(傅立叶变换)将一时域数据变换到频域?
初学信号,由于是自学,看了不少资料还是一头雾水,所以在此请教高人!现有一列数据(1000个点,采样频率为10MHz,即时间间隔为10E-7秒),信号的波形如上传图片中的左...
初学信号,由于是自学,看了不少资料还是一头雾水,所以在此请教高人!
现有一列数据(1000个点,采样频率为10M Hz,即时间间隔为10E-7秒),信号的波形如上传图片中的左上图。现在要将此信号通过傅立叶变换(但我不完全确定是通过傅立叶变换,刚接触信号)变换到频域内,以查看其能量分布,变换结果是上传图片中的左下图。
参照某参考书,我编写的Matlab程序如下:
s=importdata('s.txt'); %导入信号数据
y=fft(s,1024); %参数1024是怎么来的?(只有1000个数据点啊)
pyy=y.*conj(y); %或者是这个表达式ppy=abs(y);
f=1000*(0:512)/1024; %1000代表单位量纲变为KHz吗?这个表达式什么意思?
plot(f,pyy(1:513));
通过以上语句作出的图如上传图片中的右图,和想得到的结果完全不一样,不管是最大幅值还是最大幅值对应的频率。
另外有一个问题:采样频率是怎么体现在程序中的?
请高手帮我指出以上程序的错误,并编写一下正确的程序(结果能得到图片的左下图),本人感激不尽,回答正确的定再加分感谢!
如果需要原信号数据,在我的文库里,文件名是“10.7.8信号数据”(注意文件名,我的文库里有几个文件,容易混淆),里面共2列数据,第一列是时间,第二列是信号。
上面有个笔误:正文第二行的“采样频率为10M Hz,即时间间隔为10E-7秒”改为“1E-7秒”。
由于百度要对上传附件转换,“10.7.8信号数据”此文件可能要明天才看到。可用文库里的“10.7.7信号数据”代替,只是该文件的数据采样为100M Hz,即时间间隔为1E-8秒,其他情况两个文件都一样。 展开
现有一列数据(1000个点,采样频率为10M Hz,即时间间隔为10E-7秒),信号的波形如上传图片中的左上图。现在要将此信号通过傅立叶变换(但我不完全确定是通过傅立叶变换,刚接触信号)变换到频域内,以查看其能量分布,变换结果是上传图片中的左下图。
参照某参考书,我编写的Matlab程序如下:
s=importdata('s.txt'); %导入信号数据
y=fft(s,1024); %参数1024是怎么来的?(只有1000个数据点啊)
pyy=y.*conj(y); %或者是这个表达式ppy=abs(y);
f=1000*(0:512)/1024; %1000代表单位量纲变为KHz吗?这个表达式什么意思?
plot(f,pyy(1:513));
通过以上语句作出的图如上传图片中的右图,和想得到的结果完全不一样,不管是最大幅值还是最大幅值对应的频率。
另外有一个问题:采样频率是怎么体现在程序中的?
请高手帮我指出以上程序的错误,并编写一下正确的程序(结果能得到图片的左下图),本人感激不尽,回答正确的定再加分感谢!
如果需要原信号数据,在我的文库里,文件名是“10.7.8信号数据”(注意文件名,我的文库里有几个文件,容易混淆),里面共2列数据,第一列是时间,第二列是信号。
上面有个笔误:正文第二行的“采样频率为10M Hz,即时间间隔为10E-7秒”改为“1E-7秒”。
由于百度要对上传附件转换,“10.7.8信号数据”此文件可能要明天才看到。可用文库里的“10.7.7信号数据”代替,只是该文件的数据采样为100M Hz,即时间间隔为1E-8秒,其他情况两个文件都一样。 展开
3个回答
展开全部
s=importdata('s.txt');
y=fft(s,1024); %引入1024,是因为2的整数次幂点的FFT更好做一点,调用这个函数相当于将长度为1000的s补零至1024个点,做1024点FFT,效果等效于频域增加采样点
pyy=y.*conj(y); %不相当于ppy=abs(y),相当于ppy=abs(y).^2
f=10000*(0:512)/1024; %设定横坐标尺度,提醒一下楼主,10E-7对应的1E-6,你的意思应该是1E-7吧.因为横坐标以1kHz为单位,采用频率应该是10000kHz,所以10000代表的是这个意思,FFT最中间的点(以0开头的512点或者以1开头的513点)代表了一半采样频率的频率分量.
plot(f,pyy(1:513),'.-'); %绘制命令,如果要达到左图的频率范围,建议采用plot(f(1:25),pyy(1:25),'.-'),但是可以看到绘制的点数太少.
因此个人建议采用如下的语句
s=importdata('s.txt');
y=fft(s,10000);
pyy=y.*conj(y);
f=10000*(0:250)/10000;
plot(f(1:251),pyy(1:251),'.-');
因为没有s的原始数据,没法给你画图,猜测是加了哈宁窗的正弦信号.
y=fft(s,1024); %引入1024,是因为2的整数次幂点的FFT更好做一点,调用这个函数相当于将长度为1000的s补零至1024个点,做1024点FFT,效果等效于频域增加采样点
pyy=y.*conj(y); %不相当于ppy=abs(y),相当于ppy=abs(y).^2
f=10000*(0:512)/1024; %设定横坐标尺度,提醒一下楼主,10E-7对应的1E-6,你的意思应该是1E-7吧.因为横坐标以1kHz为单位,采用频率应该是10000kHz,所以10000代表的是这个意思,FFT最中间的点(以0开头的512点或者以1开头的513点)代表了一半采样频率的频率分量.
plot(f,pyy(1:513),'.-'); %绘制命令,如果要达到左图的频率范围,建议采用plot(f(1:25),pyy(1:25),'.-'),但是可以看到绘制的点数太少.
因此个人建议采用如下的语句
s=importdata('s.txt');
y=fft(s,10000);
pyy=y.*conj(y);
f=10000*(0:250)/10000;
plot(f(1:251),pyy(1:251),'.-');
因为没有s的原始数据,没法给你画图,猜测是加了哈宁窗的正弦信号.
展开全部
y=fft(s,N); %N应该是采样数据的点数,不能照搬书上的
N1=length(y);
f=n*fs/N1; %n=(0:N1/2-1),fs是采样频率
N1=length(y);
f=n*fs/N1; %n=(0:N1/2-1),fs是采样频率
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询