brightfay 发表于 2007-8-15 17:08

请教一个最原始的傅立叶变换的程序

我不想用现成的FFt变换,想用Matlab编一个求频谱的程序,直接用傅立叶变换,因为我在研究非均匀采样的问题,需要从这一步着手,但是怎么也出不来,急死了,高手们赐教阿!
设信号为x(t)=sin(2*pi*f*t);f=50Hz,采样频率为128Hz,采样128点,频率分辨率为1Hz,画出频谱图,用傅立叶变换的公式怎么弄?我自己编的不对
clear
N=128;
dt=1/N;
t=*dt;
fs=128;
f=sin(2*pi*50*t);
wf=100;
Nf=100;
w1=linspace(0,wf,Nf);
F1=f*exp(-j*t'*2*pi*w1)*dt;
subplot(1,2,1),plot(t,f)
subplot(1,2,2),plot(w1,abs(F1))

[ 本帖最后由 zhlong 于 2007-8-15 17:35 编辑 ]

zhlong 发表于 2007-8-15 22:01

你这个其实就是直接根据离散傅立叶变换的公式来写程序,参考下面两个程序:
clear
N=128; %信号长度
dt=1/N;
t=*dt;
fs=128;
f=sin(2*pi*50*t);
wf=100;
Nf=100;%离散傅立叶变换频率点数
w1=;
F1=f*exp(-j*t'*2*pi*w1)*dt;
subplot(1,2,1),plot(t,f)
subplot(1,2,2),plot(w1,abs(F1))

clear
N=128; %信号长度
dt=1/N;
t=*dt;
fs=128;
f=sin(2*pi*50*t);
n = ;
k = n;
Wn = exp(-j*2*pi/N);
nk = n'*k;
Wnnk = Wn.^nk;
F1 = f * Wnnk;
subplot(1,2,1),plot(t,f)
subplot(1,2,2),plot(abs(F1))

brightfay 发表于 2007-8-16 09:06

非常感谢楼上的指教, 但是我弄了后还是不对啊,不是应该只在50HZ出现一个幅度为1的脉冲吗?但是按照楼上程序做出来的图出现两个阿!楼上的高手再帮我看看!

brightfay 发表于 2007-8-16 09:13

我不会把图直接贴上去:@(

zhlong 发表于 2007-8-16 09:15

回复 #4 brightfay 的帖子

两个谱峰是对称的,你画图只要画到fs/2就可以了,不用全部画出来。

brightfay 发表于 2007-8-16 09:46

这个是作者自己画的图,我不知道他这个图是怎么得来的!《一种非均匀采样下小信号的检测方法》,信号处理,

zhlong 发表于 2007-8-16 10:06

你具体是什么问题?就是说多了一个谱峰吗?你用fft这个matlab自带公式去算,也是有两个谱峰的。实信号都有两个共轭对称的谱峰。
你把程序中的一句改为如下就只有一个谱峰了。
F1=hilbert(f)*exp(-j*t'*2*pi*w1)*dt;

brightfay 发表于 2007-8-16 10:09

我的问题是作者怎么会得到那样的图?还有频率分辨率为1怎么体现?
你告诉我的问题我明白了!非常感谢!

zhlong 发表于 2007-8-16 10:14

回复 #8 brightfay 的帖子

那篇文章中的信号是不是非均匀采样的?而上面我们例子中的信号是均匀采样的。
你可以用figure的tools菜单下的data cursor 到你画的频谱图上去取点的坐标,你会发现取到的横坐标都是整数,这就体现了分辨率为1。你可以改一下分辨率再取点试试看。

brightfay 发表于 2007-8-16 10:21

文章的例子是均匀采样的,我的条件就是按照他的例子做的,但是和他的图不一样!郁闷,不知道作者怎么想的?:@(
页: [1]
查看完整版本: 请教一个最原始的傅立叶变换的程序