声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

楼主: yhc310

[FFT] 请教一个FFT横纵坐标显示问题

[复制链接]
发表于 2007-6-26 15:37 | 显示全部楼层

回复 #15 zhlong 的帖子

可以,就是直流没有正负之分
回复 支持 反对
分享到:

使用道具 举报

发表于 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');
增加了直流分量来进行测试!

评分

1

查看全部评分

发表于 2007-7-7 15:22 | 显示全部楼层
就是 第一行不知道为什么用绝对值啊?
发表于 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的整数倍?
发表于 2007-10-24 10:36 | 显示全部楼层

回复 #20 witty01 的帖子

采样定理规定采样频率在最大信号频率的2倍以上,但是实际中10倍左右很常见。
发表于 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应该可以满足要求吧,怎么不对呢,先谢啦
发表于 2007-10-24 11:29 | 显示全部楼层

回复 #22 witty01 的帖子

修改为 N=1200 即可

原程序的问题在于FFT计算时,并没有真正计算到3Hz的位置(计算的是3.0469Hz位置),因此峰值也只可能出现在那个位置。
发表于 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=其它的值却不行
因为现在还在犯糊涂,实在想不通,所以能告诉我这是为什么吗
发表于 2007-10-24 15:43 | 显示全部楼层
:victory: ,我知道答案了,在另外的帖子里面得到了回答,才看得到, 非常感谢

就是说 15Hz是两个程序里面df的整数倍,所以可以
当N=其它值时,只要也满足这个条件就能得到精确的横坐标,明白了,3Q!!
发表于 2007-10-26 14:17 | 显示全部楼层
总感觉大家说的都不是楼主要问的问题
发表于 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开始啊?
发表于 2007-10-28 02:55 | 显示全部楼层
哦,还有,对于24楼的问题,我有自己的看法,因为其实df就是f的interval。所以在把这每一个interval全加起来形成图像的时候,就最好是能够刚好有整数个interval,大家说我这么说,对吗?
发表于 2007-10-28 08:06 | 显示全部楼层

回复 #27 zpact 的帖子

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

[ 本帖最后由 zhangnan3509 于 2007-10-28 08:10 编辑 ]
发表于 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

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-7 09:26 , Processed in 0.071906 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表