声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

楼主: luoluo

[FFT] 这是我写的一个关于频谱细化的程序!希望和大家探讨!

[复制链接]
发表于 2006-9-6 15:20 | 显示全部楼层
我的也是matlab6.5
回复 支持 反对
分享到:

使用道具 举报

发表于 2006-9-8 20:15 | 显示全部楼层
不错,学习一下。要是有C的代码就好了。对重采样y1=resample(y,1,10);%重新采样,采样频率为fs/N的代码还是不太明白
发表于 2006-9-9 08:34 | 显示全部楼层
重新采样中怎么设置主要取决于对分辨率要提高多少倍,在上例中要提高10倍,故为y1=resample(y,1,10)。
发表于 2006-9-11 12:45 | 显示全部楼层
频率细化时,移频与不移频有什么差别呢?我用的是分数傅立叶变换的方法,是否仅仅是计算量的问题呢?请指教
发表于 2006-9-14 09:31 | 显示全部楼层
大家好!
问一下,其一,如果我想用仪器来采电动机的定子电流,采样频率应该定多少,这个是要根据自己的要求么?
其二,采样频率和每个周期的采样点数是N=f/50么?f为采样频率;如果不是的话,那是什么关系?
发表于 2006-9-14 09:44 | 显示全部楼层
问个问题,我可不可以把没有细化的频谱和细化之后的频谱都显示出来呢?
发表于 2006-9-14 18:48 | 显示全部楼层
我在http://forum.vibunion.com/thread-23569-1-1.html帖子上,已把没有细化的频谱和细化之后的频谱都显示出来了.
发表于 2008-6-5 20:53 | 显示全部楼层

这里也有一个细化频谱的程序,20倍抽取后的信号进行FFT点数的选择是怎么回事呢?

这个程序中用到了decimate( ),没用reshape( ),请问reshape( )是怎么回事?怎样用呢?
clear all;
close all;
N=input('取时间分隔的点数N=');
t=linspace(0,1,N);dt=1/N;%信号长度1秒,给出时间分割
f=10*sin(2*pi*64*t)+10*sin(2*pi*250*t)+20*sin(2*pi*256*t)+30*sin(2*pi*258*t)+20*sin(2*pi*512*t);
figure(1)
subplot(2,1,1);
stem(t,f,'g');grid%画出原始信号
title('原始信号')
xlabel('t(s)');ylabel('ft');
fw=input('需求的频谱宽度fw=');
Nf=input('需求的频谱点数Nf=');
f1=linspace(0,fw,Nf);df=fw/(Nf-1);dw=2*pi*df;
F=f*exp(-j*t'*2*pi*f1)*dt;%f傅立叶变换
subplot(2,1,2);
plot(f1,abs(F)/max(abs(F))),grid
xlabel('f1(HZ)');ylabel('|F(jf1)|');


f_0=input('需求的中心频谱f_0=');
f_1=f.*exp(-j*2*pi*t*f_0);%'.*'为元素群运算
figure(2)
subplot(2,1,1);
stem(f_1);grid
title('频移后的信号')
xlabel('t(s)');ylabel('f_1(t)');
F1=f_1*exp(-j*t'*2*pi*f1)*dt;%f_1傅立叶变换
subplot(2,1,2);
plot(f1,abs(F1)/max(abs(F1))),grid
xlabel('f1(HZ)');ylabel('|F1(jf1)|');



fw0=input('理想底通滤波器的带宽fw0(HZ)');
n2=find((f1>-fw0)&(f1<fw0));%求出底通滤波器带宽内的下标
f2=f1(n2);%取出中段频率
F2=F1(n2);%取出中段频谱
figure(3)
subplot(2,1,2);
plot(f2,abs(F2)/max(abs(F2))),grid%画出滤波后的频谱
xlabel('f2(HZ)');ylabel('|F2(jf2)|');
f_2=F2*exp(j*2*pi*f2'*t)/pi*dw;%对中段频谱求傅立叶逆变换
subplot(2,1,1);
stem(f_2),grid%画出滤波后的波形
title('滤波后的信号')
xlabel('t(s)');ylabel('f_2(t)');



y=decimate(f_2,20);% 对信号先进行滤波,然后进行 20 倍的抽取
figure(4)
subplot(2,1,1);
stem(y),grid%画出滤波后的波形
title('抽取后的信号')
xlabel('t(s)');ylabel('y(t)');
Y=fft(y);% 对信号进行 20 倍抽取后的 FFT 运算
subplot(2,1,2);
plot(abs(Y)/max(abs(Y))),grid
xlabel('f1(HZ)');ylabel('|Y(jf1)|');

程序和图形.doc

125.5 KB, 下载次数: 45

对进行20倍抽取后的信号快速傅里叶变换点数的选择是怎么回事呢?

发表于 2008-6-5 20:59 | 显示全部楼层

不好意思,上面的程序有点小问题

是函数resample( )怎么用?而不是reshape( )?o(∩_∩)o...
发表于 2008-6-6 11:25 | 显示全部楼层
本帖最后由 wdhd 于 2016-6-3 11:04 编辑
原帖由 hnyanhua 于 2008-6-5 20:53 发表
这个程序中用到了decimate( ),没用reshape( ),请问reshape( )是怎么回事?怎样用呢?
clear all;
close all;
N=input('取时间分隔的点数N=');
t=linspace(0,1,N);dt=1/N;%信号长度1秒,给出时间分割
f=10*sin ...

我想楼主是看过高怀钢的一文,在文中介绍ZFFT实现时,笫1步是频移,笫2步是滤波。在重采样之前为了防止混迭,先要进行低通滤波。而decimate函数自带滤波过程,resample函数就不带。若在下采样时要用resample函数,则在调用前应先低通滤波后再调用;调用decimate就不需要了。
发表于 2008-6-9 11:22 | 显示全部楼层

回复songzy41

我想楼主是看过高怀钢的一文,在文中介绍ZFFT实现时,笫1步是频移,笫2步是滤波。在重采样之前为了防止混迭,先要进行低通滤波。而decimate函数自带滤波过程,resample函数就不带。若在下采样时要用resample函数,则在调用前应先低通滤波后再调用;调用decimate就不需要了。
高怀钢一文介绍ZFFT实现,笫1步是频移,笫2步是滤波,下面对滤波后的信号重采样,重采样前已经对信号进行滤波了,所以不再用decimate函数,而直接用resample函数,不知道行不行,是否对结果有影响?如果再用decimate函数就进行了两次滤波,是不是更精确呢?
另外,20倍抽取后的信号进行FFT点数的选择,是不是可以通过对重采样后的序列补零到N(原序列长度),然后进行fft,这样得到的分辨率才是原来的fs/B倍?
发表于 2008-6-9 12:10 | 显示全部楼层
本帖最后由 wdhd 于 2016-6-3 11:04 编辑
原帖由 hnyanhua 于 2008-6-9 11:22 发表
高怀钢一文介绍ZFFT实现,笫1步是频移,笫2步是滤波,下面对滤波后的信号重采样,重采样前已经对信号进行滤波了,所以不再用decimate函数,而直接用resample函数,不知道行不行,是否对结果有影响?如果再用decimate函数就进行了两次滤波,是不是更精确呢?

重采样之前滤波,主要是为了防止重迭现象发生。在重采样前已经对信号进行滤波了,可以不用decimate函数,而直接用resample函数,对精度不会有影响。

另外,20倍抽取后的信号进行FFT点数的选择,是不是可以通过对重采样后的序列补零到N(原序列长度),然后进行fft,这样得到的分辨率才是原来的fs/B倍?

在重采样之后用补零方法不能增加分辨两个靠近信号的分辨率,这里对分辨率要注意有两个含义。下面我引用胡广书在“数字信号数理”一书中对分辨率的定义,要把这两个含义搞清楚。
频率分辨率可以从两个方面来定义:一是某一个算法(如谱分析方法,功率谱估计方法等)将原信号x(n)中两个靠
的很近的谱峰仍然能保持分开的能力。二是在使用DFT时,在频率轴上的所能得到的最小频率间隔Δf。”后面又说
到“在本章,因是讨论DFT问题,故使用第二个定义,即(3.7.2)式。(即Δf=fs/N)

发表于 2008-6-10 09:27 | 显示全部楼层
是的,我明白了.谢谢了.
decimate函数自带滤波过程,我可以把上面程序简化,滤波和重采样用decimate函数完成,
decimate函数应该完成的是低通滤波吧,带宽可以自己选择吧,我在Matlab中搜搜看.

我明白用补零方法不能增加分辨两个靠近信号的分辨率,因为补零并没有对原信号增加任何新的信息.这里的分辨率提高,是因为重信号的频域比原信号频域范围缩小了fs/B=A(fs是原信号采样频率,B是滤波器带宽,也就是要分析的那段频谱)倍.所以重采样信号的采样频率可以是原信号采样频率的1/A倍,这里满足了采样定律,不会有混迭.所以在频域采样点数相同情况下,分辨率提高A倍.是不是可以这样理解?
发表于 2008-6-10 09:39 | 显示全部楼层
还有,重采样后信号长度比原信号短,可以对重采样后信号补零到原信号长度,然后进行fft,fft时域采样点数和频域采样点数相同吗?这是内部函数自定义的吧.
发表于 2008-6-10 11:55 | 显示全部楼层
本帖最后由 wdhd 于 2016-6-3 11:05 编辑
这里的分辨率提高,是因为重信号的频域比原信号频域范围缩小了fs/B=A(fs是原信号采样频率,B是滤波器带宽,也就是要分析的那段频谱)倍.所以重采样信号的采样频率可以是原信号采样频率的1/A倍,这里满足了采样定律,不会有混迭.所以在频域采样点数相同情况下,分辨率提高A倍.是不是可以这样理解?

这样理解是对的。

原帖由 hnyanhua 于 2008-6-10 09:39 发表
还有,重采样后信号长度比原信号短,可以对重采样后信号补零到原信号长度,然后进行fft,fft时域采样点数和频域采样点数相同吗?这是内部函数自定义的吧.

对重采样后信号可以补零,然后再做fft。fft时域采样点数和频域采样点数相同是DFT定义的,可以从DFT的表达式上看出,都是N点,而FFT只是DFT的快速运算方法。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-13 12:22 , Processed in 0.075856 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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