声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3999|回复: 16

[FFT] 用11采样点构造1Hz的简谐信号,怎样做更好?

  [复制链接]
发表于 2011-3-21 11:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 Rainyboy 于 2011-3-21 11:46 编辑

写在前面的PS:试用了一下邀请功能……不知道有没有打扰到各位……如有冒犯,多包涵……

有一个简谐信号,假设为:y(t)=1*sin(2*PI*t),显然其频率为1Hz,假如在一周期内以11个点来离散这个信号,我想与各位探讨如下两种方法的可行性和优劣。

方法一(后文图中的红色时序信号):以采样频率fs=10Hz,即采样间隔dt = 1/fs = 0.1s,在采样时间1s内,对y(t)进行采样:
           Y_1(i) = y(i*dt) ; i = 0,1,...,10
方法二(后文图中的蓝色时序信号):以频率分辨率1Hz,构造如下频谱:
           F_Real(i)    = [0,0,0,0,0,0];
           F_Image(i) = [  ,-1,0,0,0,0];
           将上述频谱作IFFT变换,同样可以得到以采样频率fs=10Hz,即采样间隔dt = 1/fs = 0.1s,在采样时间1s内的数据:
           Y_2 = IFFT(F_Real,F_Image);

按照上述假设算了一下,下面是用两种方法产生的序列的时序结果(红色的是方法一,蓝色的是方法二):
3_comp.png

分别对各自进行FFT分析,得(颜色约定同上):
1_ri.png
2_aa.png
5_ri.png
6_aa.png

===========================================================

可以看到,第二种方法似乎破坏了时序信号在采样时间内的周期性(Y_2(1)不等于Y_2(0)),但是频谱却很干净……
第一种方法在采样时间内的周期性没问题,但是有不希望出现的频率成分……

当然,当取点数(采样频率)不断增大的时候,两种方法得到的结果趋于一致,但是我这里只是想探讨在采样频率并非远大于原信号时的构造方法。

我是这样想提出这个问题的:如果在瞬态动力学分析中,想给系统一个单频的激振力,如果采用方法一,似乎激振力的频率并不是单一的;而采用方法二,时域激励信号又包含冲击(每个周期的开始和结束)。

所以比较纠结,故来此征询:如果只有11个采样点,想要模拟一个1Hz的正弦信号,怎样更好呢?

回复
分享到:

使用道具 举报

发表于 2011-3-21 20:48 | 显示全部楼层
经过和Rainboy的讨论,我们一致认为这种现象肯定是由离散误差造成的,而且可以通过增加采样点来解决。由于这种离散误差的存在,我们不太可能同时得到精确的频域和时域信号,所谓“鱼与熊掌不能兼得”。

在进行时域信号的频率分析时,能否通过插值增加伪数据点来改善这种状况?
 楼主| 发表于 2011-3-21 21:09 | 显示全部楼层
回复 2 # mistuning 的帖子

通过时域内插确实可以改善方法一的频率成分:
00.png

然而这实际上还是在某种程度上增加了信号的采样点数……
发表于 2011-3-21 23:31 | 显示全部楼层
我想问题出在采样点的数目上。如果点数为2的整次幂,比如8或16。IFFT的结果不会这么难看。

点评

赞成: 5.0
赞成: 5
多谢!明儿试试~  发表于 2011-3-21 23:37
发表于 2011-3-22 07:55 | 显示全部楼层
回复 1 # Rainyboy 的帖子

你的方法1:以采样频率fs=10Hz,即采样间隔dt = 1/fs = 0.1s,在采样时间1s内,对y(t)进行采样:采11个点采出来不是整周期的,而是应该用采样频率11Hz,采11个点才是整周期,虽然画图看起来不是整周期,而像兰的一样。
发表于 2011-3-22 10:34 | 显示全部楼层
方法二得到的结果在时序后添个零就是方法一用11Hz离散的结果。也就是说,用频域构造得到的时序不包括第二个周期的第一个点。个人感觉,只用11个采样点构造1Hz的信号似乎没有很好的方法可以提高精度
 楼主| 发表于 2011-3-22 10:51 | 显示全部楼层
回复 6 # hustxyong 的帖子

对第二种方法,在时序后添加一个0不就成了(1/1.1)Hz的结果了么?然而我明明是用频域的1Hz的谱线构造出来的啊?
 楼主| 发表于 2011-3-22 10:53 | 显示全部楼层
回复 5 # hcharlie 的帖子

采样频率11Hz的话,一个周期内不就有12个点了么?
发表于 2011-3-22 14:20 | 显示全部楼层
如前所述,方法一和方法二之所以有区别,在于用频域构造得到的时序(方法二)不包括第二个周期的第一个点。举例如下:
y1 = 1*sin(2*pi*linspace(0,1,10+2))'; % fs=11
Fy11 = [0 -11/2*i 0 0 0 0 0 0 0 0 11/2*i].'; %  %11点fft,系数 11/2即fft点数N/2,为Matlab中做fft算法的特点,论坛中有讨论
yifft11 = ifft(Fy11);
y1(1:11) - yifft11
ans =

  1.0e-015 *

                  0
                  0
                  0
   0.11102230246252
   0.11102230246252
   0.38857805861880
   0.27755575615629
   0.11102230246252
                  0
   0.11102230246252
  -0.66613381477509

y0 = 1*sin(2*pi*linspace(0,1,10+1))'; % fs=10
Fy10 = [0 -10/2*i 0 0 0 0 0 0 0 10/2*i].'; %  %10点fft
yifft10 = ifft(Fy10);
y0(1:10) - yifft10
ans =

  1.0e-015 *

                  0
                  0
   0.11102230246252
   0.22204460492503
   0.11102230246252
   0.12246467991474
   0.11102230246252
  -0.11102230246252
  -0.22204460492503
  -0.22204460492503


发表于 2011-3-22 14:46 | 显示全部楼层
本帖最后由 hcharlie 于 2011-3-22 15:14 编辑

你错就错在此处!
你如果用你采样的数,连续的反复延长,你就知道采样频率11Hz一个周期只能是11个点。
 楼主| 发表于 2011-3-22 20:53 | 显示全部楼层
本帖最后由 Rainyboy 于 2011-3-22 20:55 编辑

回复 9 # hustxyong 的帖子


多谢!
我明白你的意思了,实际上用反傅里叶变换,以10Hz采样率和1s的采样时间重构频率为1Hz数据时,应该采用10个点重构,而不是11个点,是吧?
comp.png
1.png
2.png
==================================================

OK,上一个问题搞定了……根据上一个问题里面的一些启示,我又有了一个新的问题(SORRY……问题多……):

假如我们在对一个信号进行时域采样时,应该采用上述红线的采样方式(即保证信号的周期性),还是蓝线的(因为,正如上述构造过程展示了,这种“少一个点”的方式有很干净的频谱)?

以下面的时序为例(包含常值、1Hz的正弦、5Hz及10Hz的余弦):
x(t) = 1 + sin(2*PI*1*t) + cos(2*PI*5*t) + cos(2*PI*10*t)
采样频率为30Hz,采样时长为10s

按照第一种方法,采样点数为30*10 + 1 ,即保证采样开始时的值等于结束时的值,其FFT分析结果为:
23.png


按照第二种方法,采样点数为30*10,即少采最后一个点,其FFT结果为:
22.png


我的疑问在于,红色的采样方式,似乎是我印象中应该常用的方式(因为在时域延拓之后是周期的,没有间断),频域不是很干净,而且在各自频率分量处的取值和相位有问题;而蓝色的采样方式,延拓之后在时域上有一个间断,但是其频域却(出乎我意料的)精确。那我们在对一个一直周期(或许不知其每个频率成分对应的幅值)的信号进行采样时,应该怎样做呢?



 楼主| 发表于 2011-3-22 21:01 | 显示全部楼层
回复 10 # hcharlie 的帖子


非常感谢!
我大概明白你的意思了,我是想说,以fs为采样频率,去对一个信号采样T秒时,为了保证信号的在开始和结束的连续性,总采样点数应该是 N = fs*T +1 个吧?

如我在11楼回复hustxyong的那样,这样说来,我们在对一个信号采样时,应该取 N =  fs*T个点呢,还是N =  fs*T+1个?我用一个多频的信号做了个例子,也在11楼的回复中,烦劳拨冗解惑……不甚感激!
发表于 2011-3-22 22:05 | 显示全部楼层
本帖最后由 hcharlie 于 2011-3-22 22:29 编辑

回复 12 # Rainyboy 的帖子

应该取 N =  fs*T个点!
忘掉你概念中念念不忘的+1吧!
似不完整实际完整。
你不要把你的采样看作为没有宽度的一个点,而看成宽度为ΔT的一段,N个采样看成N个ΔT的小时间段,加起来就是完整周期,也许能想通了。以8个采样点为例,请看下图,一个正弦波采集了8个点,实际离散化以后变成了8级阶梯波,8个点组成完整的一个周期,第九个点已经属于下一个周期了。
N8.png

点评

赞成: 5.0
赞成: 5
同意!  发表于 2011-3-23 03:08
 楼主| 发表于 2011-3-22 22:36 | 显示全部楼层
本帖最后由 Rainyboy 于 2011-3-22 22:39 编辑

回复 13 # hcharlie 的帖子

呵呵,谢谢图文并茂的清晰地讲解!之所以念念不忘是因为我也许错误地理解了李德葆在《实验模态分析及其应用》书第104页所说的
由此可见,为避免泄露,对于有限带宽的周期函数x(t)来说,窗函数w(t)的窗长必须等于x(t)的一个周期或整数倍周期。保证整周期截断,实际上是保证将窗中函数的拓本依次连接后保证在连接处连续,从而能恢复函数的原样。这一点对于随机函数来说,是不可能做到的,因为严格说来,随机函数的周期无限长,对于随机信号,为了抑制泄露,应采取特别设计的窗函数,用以消除函数截断的始末端的不连续性,如……

如此看来,这里的连续性并不是由采样的数据来保证的,而是由被采样信号来保证的,如上述对1hz信号的1秒采样,采了10个点,则具有你所说的“看似不完整实则完整”的性质。不然,若对1.5hz的信号进行1秒的采样,采10个点,就是“看似不完整实际也不完整”了(当然,这里的不完整与采样点数已无关系……)?


发表于 2011-3-23 11:40 | 显示全部楼层
回复 14 # Rainyboy 的帖子

你引用的“整周期截断”,“消除函数截断的始末端的不连续性”。。。
这是指首末能接得上,并非一定要首末相等,相等就多余了一个了。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-28 02:50 , Processed in 0.133923 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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