yangzj 发表于 2007-6-26 15:37

回复 #15 zhlong 的帖子

可以,就是直流没有正负之分

zhangnan3509 发表于 2007-6-26 16:02

回复 #14 yangzj 的帖子

谢谢你的意见

破凰 发表于 2007-6-29 23:20

回复 #14 yangzj 的帖子

求单边谱时,直流量也不用乘2的吧。
ps:对版主贴的程序作了一下修改
N=1024;
fs=120;
t=(0:N-1)/fs;      % 时间序列
x=2*sin(2*pi*15*t)+2; %增加了直流分量
figure(1)
subplot(2,1,1);
plot(t, x);
xlabel('t/s');
a=abs(fft(x));   

df = fs/N;            %频域分辨率 Hz
f = (0:N/2-1)*df;       %频域序列
a1= 2*a(1:N/2)/N;
a1(1)=a1(1)/2;          %零频分量不乘2
subplot(2,1,2);
plot(f, a1);
xlabel('f/Hz');
增加了直流分量来进行测试!

sjh821 发表于 2007-7-7 15:22

就是 第一行不知道为什么用绝对值啊?

witty01 发表于 2007-10-24 10:29

本帖最后由 wdhd 于 2016-9-8 13:53 编辑

原帖由 破凰 于 2007-6-29 23:20 发表
求单边谱时,直流量也不用乘2的吧。
ps:对版主贴的程序作了一下修改
N=1024;
fs=120;
t=(0:N-1)/fs;      % 时间序列
x=2*sin(2*pi*15*t)+2; %增加了直流分量
figure(1)
subplot(2,1,1);
plot(t, x) ...
请问:这个程序的频率能精确定位在15hz的原因,是否是因为120是15的整数倍?

zhangnan3509 发表于 2007-10-24 10:36

回复 #20 witty01 的帖子

采样定理规定采样频率在最大信号频率的2倍以上,但是实际中10倍左右很常见。

witty01 发表于 2007-10-24 10:47

求助:

请教各位,我这个两个正弦信号复合的信号,分别是3Hz,和 20Hz, 为什么不能将横坐标精确定位在3和20呢? 程序如下:
figure(1)
subplot(211)
fs=120;
N=1024;
t=(0:N-1)/fs;      % 时间序列
x=2*sin(6*pi*t)+5*cos(40*pi*t);
plot(t,x)
title('两个频率成分3Hz和20Hz复合的正弦信号')
xlabel('t/s') ;grid on
subplot(212)

y=2*abs(fft(x,N))/N;
df = fs/N;            %频域分辨率 Hz
q = (0:N/2-1)*df;       %频域序列
plot(q,abs(y(1:N/2)))
title('正弦信号的FFT f=120')
xlabel('频率Hz') ;grid on

是不是要对3和20Hz取一个最小公倍数啊,fs=120应该可以满足要求吧,怎么不对呢,先谢啦

xray 发表于 2007-10-24 11:29

回复 #22 witty01 的帖子

修改为 N=1200 即可

原程序的问题在于FFT计算时,并没有真正计算到3Hz的位置(计算的是3.0469Hz位置),因此峰值也只可能出现在那个位置。

witty01 发表于 2007-10-24 15:30

我明白一些了,但是有一点还是糊涂的,下面这两个程序都能实现在15hz处准确的显示fft的结果
如下:
1、
N=1200;
fs=120;
t=(0:N-1)/fs;      % 时间序列
x=2*sin(2*pi*15*t);
figure(1)
subplot(2,1,1);
plot(t, x);
xlabel('t/s');
y=2*abs(fft(x,N))/N;   
df = fs/N;            %频域分辨率 Hz
f = (0:N/2-1)*df;       %频域序列
subplot(2,1,2);
plot(f, y(1:N/2));
xlabel('f/Hz');
2、
N=1024;
fs=120;
t=(0:N-1)/fs;      % 时间序列
x=2*sin(2*pi*15*t);
figure(1)
subplot(2,1,1);
plot(t, x);
xlabel('t/s');
y=2*abs(fft(x,N))/N;   
df = fs/N;            %频域分辨率 Hz
f = (0:N/2-1)*df;       %频域序列
subplot(2,1,2);
plot(f, y(1:N/2));
xlabel('f/Hz');
就是N=1200 和 1024时,都可以得到正确的结果,N=其它的值却不行
因为现在还在犯糊涂,实在想不通,所以能告诉我这是为什么吗

witty01 发表于 2007-10-24 15:43

:victory: ,我知道答案了,在另外的帖子里面得到了回答,才看得到, 非常感谢

就是说 15Hz是两个程序里面df的整数倍,所以可以
当N=其它值时,只要也满足这个条件就能得到精确的横坐标,明白了,3Q!!

zpact 发表于 2007-10-26 14:17

总感觉大家说的都不是楼主要问的问题

zpact 发表于 2007-10-28 02:48

clear;clc;
fs=1000;
N=3000;
t=(0:N-1)/fs;
tt=0:1/fs:N-1;
f1=70;
g=1.5*sin(2*pi*f1*t);
subplot(2,1,1)
plot(t,g);

Gg=fft(g,N);
Ggmag=abs(Gg);
df=fs/N;
f=(1:N/2)*df;
Ggmags=fftshift(Ggmag);

subplot(2,1,2)
plot(f,Ggmag(1:N/2));
这样是可以的。但是当我把最后一行改为plot(f,Ggmag(0:N/2-1));系统就说
??? Subscript indices must either be real positive integers or logicals.
Error in ==> ffttry at 18
plot(f,Ggmag(0:N/2-1));
这是为什么啊,是不是因为Ggmag其实是一个矩阵。第一个元素必须是1开始啊?

zpact 发表于 2007-10-28 02:55

哦,还有,对于24楼的问题,我有自己的看法,因为其实df就是f的interval。所以在把这每一个interval全加起来形成图像的时候,就最好是能够刚好有整数个interval,大家说我这么说,对吗?

zhangnan3509 发表于 2007-10-28 08:06

回复 #27 zpact 的帖子

搜索一个版面,看看以前的帖子

[ 本帖最后由 zhangnan3509 于 2007-10-28 08:10 编辑 ]

songzy41 发表于 2007-10-28 08:31

本帖最后由 wdhd 于 2016-9-8 13:53 编辑

原帖由 zpact 于 2007-10-28 02:48 发表
plot(f,Ggmag(1:N/2));
这样是可以的。但是当我把最后一行改为plot(f,Ggmag(0:N/2-1));系统就说
??? Subscript indices must either be real positive integers or logicals.
Error in ==> ffttry at 18
plot(f,Ggmag(0:N/2-1));
这是为什么啊,是不是因为Ggmag其实是一个矩阵。第一个元素必须是1开始啊?

在MATLAB中数组或矩阵的下标必须从1开始,不能从0开始。而频率的设置却要从0值开始,故把
f=(1:N/2)*df;
改为
f=(0:N/2-1)*df;
这样可看到峰值就在70处。

[ 本帖最后由 songzy41 于 2007-10-28 08:41 编辑 ]
页: 1 [2] 3
查看完整版本: 请教一个FFT横纵坐标显示问题