matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx

上传人:b****7 文档编号:9187852 上传时间:2023-02-03 格式:DOCX 页数:8 大小:32.42KB
下载 相关 举报
matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx_第1页
第1页 / 共8页
matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx_第2页
第2页 / 共8页
matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx_第3页
第3页 / 共8页
matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx_第4页
第4页 / 共8页
matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx

《matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx》由会员分享,可在线阅读,更多相关《matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx(8页珍藏版)》请在冰豆网上搜索。

matlab论坛求助信号加窗后的处理看不懂程序后面的原理.docx

matlab论坛求助信号加窗后的处理看不懂程序后面的原理

Matlab中文论坛求助帖:

求助:

信号加窗后的处理,看不懂程序后面的原理。

len=48000;

winType='hody';%这是什么窗呢?

winMinPhase=-pi;%最小相位

winMaxPhase=pi-2*pi/len;%最大相位

x=linspace(winMinPhase,winMaxPhase,len)';%均分

switchwinType

case'hody'

win=0.06372625603133489+...

cos(x)*0.23940452419651895+...

cos(x).^2*0.35000203221155923+...

cos(x).^3*0.24817008904762164+...

cos(x).^4*0.08582735035413477+...

cos(x).^5*0.01242535720360149+...

cos(x).^6*0.0004443909552289012;

hw=7;

......

end

dcCorrection=1/sum(win);

dcFft=fft(win);

dcFft=dcFft(1:

min(hw,len))*dcCorrection;

win_gain=sqrt(1/(len*sum(win.^2)));

 

sRate=len;

t=1;

n=0:

1/sRate:

t-1/sRate;

m=floor(length(n)/2);

input=[zeros(m,1);ones(length(n)-m,1)];

xfrmLen=floor(length(input)/2)+1;%频谱半长度+1,对应频率为pi/2

inputFft=fft(input.*win);%inputFft,加窗后的频谱

dc=inputFft

(1).*dcCorrection;

inputFft(1:

hw)=inputFft(1:

hw)-(dcFft*inputFft

(1));

inputFft

(1)=inputFft

(1)/sqrt

(2);%计算inputFft第一项的有效值

ifrem(length(inputFft),2)==0%若length(inputFft)为偶

inputFft(xfrmLen)=inputFft(xfrmLen)/sqrt

(2);%计算inputFft中间一个的有效值

end

xfrm=inputFft(1:

xfrmLen)*sqrt

(2);%默认信号为模拟信号,此处求有效值

%因为:

2*inputFft(1:

xfrmLen)*sqrt

(2)/2=inputFft(1:

xfrmLen)*sqrt

(2)

xfrm=win_gain*xfrm;%这是干什么呢?

xfrm=xfrm.*conj(xfrm);%这又是得到什么?

功率谱密度?

将信号加窗后做频谱变换,后续涉及到的一些处理过程都和窗函数有关,看不懂一些处理过程。

想请教下专家,谢谢了!

~~~

有疑问的地方基本都在程序注释里面写了。

首先,第5行,没见过“hody”窗,不知道是啥窗(当然,窗的形状这里是知道的),网上没查到hody窗,我想是否是哪个专业应用?

第二,39、40行,是去掉频谱中直流分量的,并且和窗函数有关,我想知道为什么这样处理。

平时去直流分量直接将时域信号减去均值后再做频谱变换吧?

但这里,不在时域处理,在频域,对频谱数据的前几项做这样的处理,是什么原理?

可否公式说明?

(那个hw可以认为是和此hody窗相关的一个因子。

第三,49行:

xfrm=win_gain*xfrm;这里win_gain是个什么因子,肯定和窗函数有关,这里是干嘛呢?

如果说前面是将频谱数据去掉直流分量影响,并将模拟信号的幅度谱变为其有效值谱,那么这里将有效值谱乘以win_gain,即是除以sqrt(len*sum(win.^2)),是何意?

最后,最后一句,紧接着上面一句,如果说上句计算的变量有可能是无意义的,只是一个中间量,那么这句是程序最后一句,得到的量应该是有意义的了。

为了保证变量都是有意义的,我们从原去掉了直流成分影响的频谱数据inputFft,推导到此处xfrm,具体是:

xfrm=(win_gain*sqrt

(2))*inputFft(1:

xfrmLen).*conj((wi_gain*sqrt

(2))*inputFft(1:

xfrmLen))

=sqrt(1/(len*sum(win.^2)))*sqrt

(2))*inputFft(1:

xfrmLen)*conj(sqrt(1/(len*sum(win.^2)))*sqrt

(2))*inputFft(1:

xfrmLen))

=2*inputFft(1:

xfrmLen)*conj(inputFft(1:

xfrmLen))/len/sum(win.^2)

从最后结果可以看出,2*inputFft(1:

xfrmLen)*conj(inputFft(1:

xfrmLen))/len是功率谱密度,那么再除以一个sum(win.^2)是得到什么呢?

后期回答:

在功率谱估计的方法中,Welch法估计有这样的公式:

分段加窗的周期图:

(1)

其中,

为归一化因子。

这里有个除以窗函数平方求和再去均值的因子U,这个U和M相乘,刚好得窗函数平方求和。

书上说公式1得到的是每一段的周期图(功率谱),总的周期图(功率谱)即是这些分段的周期图求均值。

当我们将分段长度设置为等于信号长度时,则只分一段,上述M即是信号长度,也就是窗长度,得到的一段周期图即是信号的周期图,此时有:

这里得到的功率谱,是信号加窗后做FFT幅值的平方,再除以窗函数各项平方的和。

与程序中计算结果还是差一个除以信号长度的关系。

再后期回答(20140819):

 版主好,谢谢版主一直以来耐心的解答。

没及时回你,很不好意思。

我这里纠结其实是涉及到一些具体计算时,频谱、功率谱等怎样正确运用。

  其实我一直都有一个疑问,那就是,到底什么是功率谱密度?

或者说,它的物理意义到底是什么?

再或者说,它到底有什么作用?

一直以来,几乎所有的介绍频谱、功率、功率谱(密度)、能量谱的书籍资料上,从来就是给计算公式,从来不在计算之后说明一下,得到的数据,每个数据点表示什么物理意义。

         

  书上的数字信号功率谱密度计算,经典方法的周期图法最好理解:

信号fft后绝对值的平方,再除以信号点数。

自相关法,我验算过,结果是大致相等的,特别是在主峰值处,值基本是一样的(不一样可能有fft时频谱泄露导致)。

但我还是不知道得到的结果又什么实际意义。

  比如,一个正弦信号,振幅为1,频率为10Hz。

用采样率1000Hz的采样电路对其进行采样1秒。

理论上,得到1000个采样点。

对采样信号做1000点的fft。

按照上述周期图法求信号的功率谱密度,将每个变换值取绝对值,平方,再除以信号点数,得到的序列值就是功率谱密度。

那么上述信号最后计算出的功率谱密度是什么样的呢?

  结果是,在10Hz和-10Hz(将频谱做fftshift,再考虑正负频率)处有(1*1000/2).^2/1000=250的峰值,其他频率位置值为0(实际上,用matlab求,有很小的值,近似为0)。

我要问的就是,这个250表示什么呢?

或者说有什么实际意义呢?

  而且,如果对原信号加一个窗(除了矩形窗),比如汉宁窗,得到的功率谱密度会不一样,以上述标准的正弦信号为例,理论上,不加窗时,只要整周期采样,做fft即能得到准确的频谱以及所谓的功率谱密度。

但是当采集时起始点不是在正弦信号的0值点,对信号加个窗,就会将原信号改变,得到的频谱和功率谱就不对了!

也就需要校正了!

  实际上,所有的信号加窗后的频谱和功率谱都需要校正!

校正方法,正如我帖子里面那种:

对于引入直流成分的窗,必须去直流成分,然后,在变换结果的整体幅值上,也需要根据窗的参数进行调整。

比如welch法加窗之后乘以归一化因子。

开始,我比较奇怪为什么welch法按照公式推理,只是将原信号在fft之后取绝对值、平方,并没有除以点数,而是乘以了归一化因子,相当于除以了窗函数平方求和值,这太奇怪了!

为什么除以了之窗函数平方求和值就不除以点数呢?

得到的结果准么?

  接着,我将上述窗函数换成矩形窗,答案就出现了!

矩形窗平方求和结果就是点数!

所以,求功率谱密度时不加窗除以点数,和加窗时除以窗函数平方求和值,是统一的!

其实都是除以窗函数平方求和值。

用标准正弦信号来验证,不加窗求功率谱和加窗求功率谱后按照上述方法调整功率谱,结果是一致的!

值还是250左右!

  我纠结的还是这个250!

呵呵。

  我一直一直都是坚持努力拼命地想想清功率谱到底表示什么。

我知道上述正弦信号的有效值是sqrt

(2)/2,功率是1/2。

按照我希望的、比较好理解的思维,功率谱密度不是应该表示功率在频率上的分布么?

那么,上述功率谱密度应该是在频率10Hz处峰值是1/2才对啊!

为什么是250呢?

而且,假如我采样2秒,得到的值是500,......,诸如此类——功率谱是变化的,这也太奇怪了!

那么我说原信号的功率谱,到底是取哪个值好呢?

  没想到,我在帖子中的这个例子,完全解决了我的上述疑问。

因为,如果原信号是上述正弦信号,那么按照程序中的加窗、fft、去直流、幅值调整,最后求得的xfrm,在10Hz处幅值就是为1/2!

就是信号在10Hz的功率!

功率值开方,即得到有效值。

——这,是否才是最有物理意义的呢?

  在这些变换中,去直流好理解,去掉加窗的影响上面也讲过。

唯一比上述处理过程多的,正是那个我纠结的问题——为什么求模拟信号有效值和最终求功率谱密度时除以了信号长度!

那是因为在求频谱时求得是实际的频谱:

fft结果绝对值先乘以sqrt

(2),除以点数的开方值!

刚好是sqrt

(2)/2.再平方,得到的就是1/2,如果称这个为功率谱密度,是不是更合适呢?

以后,计算功率谱密度,是不是该这样算呢?

  当然,也看到一些书上明确说功率谱密度和功率没直接的关系,而是需要变换推导得到。

那么我疑惑的是:

既然功率谱密度也要从频谱求得,而从频谱也能直接求得功率,那为什么还要绕个弯子先去求功率谱,再求功率呢?

是否功能率谱密度还有其他作用?

还是以前的信号处理,不好直接求频谱,而只能直接求功率呢(不通过频谱的方法)?

  恳请版主指教。

也欢迎大家指点!

一直以来,几乎所有的介绍频谱、功率、功率谱(密度)、能量谱的书籍资料上,从来就是给计算公式,从来不在计算之后说明一下,得到的数据,每个数据点表示什么物理意义。

举个例子,比如频谱。

书上讲,将一个采集的信号做FFT,得到的就是频谱,几乎都到此为止!

最多的,也只不过告诉我们怎么画出横轴为频率,纵轴为频谱绝对值(其实书上貌似也没讲频谱到底是那些复数呢,还是绝对值,个人觉得频谱应该是取绝对值,那么,前面FFT变换结果该叫什么呢?

这就是在我们中国几乎所有的课本上看到的讲述!

甚至是很经典很权威很咋样咋样的书!

但是,我想问的是,上述频谱的物理意义是什么?

直接做FFT之后得到的复数值序列,为什么要取绝对值呢?

先回答后一个问题吧,其实得到的每个频率点上的复数值,其相位表示采集信号的初始相位,模值表示此频率的一半累积振幅!

——注意,直接fft变换来的结果就是这样的!

如果编书者稍微用点心,就该这样写!

然而,一半累积振幅,这个概念不好理解,也几乎没用。

那么如果给一个实例,就可以理解了。

比如原信号是一个振幅为1、频率为10的正弦波,我们用采样率1000的采样电路对其采样2秒,理论上,我们将采集到1000*2=2000个点。

这些点可认为是在原正弦信号(周期重复)上某一段以相等间隔取2000个点。

如果我们刚好是从正弦信号的0值(对应相位为0或pi)开始取第一个点,那么做fft(无论是用1000点变换还是2000点变换,只不过频率分辨率不同,不影响变换结果)之后,在对应10Hz频率的位置,复数的相位就是0或者pi。

对此处复数取模值,值为振幅*2000/2(理论值,matlab的fft计算也会是这个值)。

所以,一半累积振幅的意思是:

振幅乘以信号点数的一半!

我们改变信号采样的起始点,看10Hz处的变换结果,可看到,相位可不同,但幅值却永远是一样的!

(只要信号点数不变!

那么可知,同样是上述信号,当我们只改变采样点数(比如改变采样时间)时,得到的fft变换结果,在相同频率处频谱幅值是不一样的。

这就带来一个问题,当不同的人来对这个信号求频谱时,就可能得到不同的频谱!

到底哪个是对的呢?

你可以说两个都对,因为都可以看出主频值。

但是,如果要涉及到具体的数值计算时,两个数值不同,该以哪个为准呢?

上述矛盾也就是,同一个信号的频谱会随着采样点数的改变而改变!

——这合乎逻辑么?

明显不合!

因为频谱是表征信号频域的特征的,同一个信号(平稳信号),在频域的特征应该永远不变才对啊。

那么问题出在哪里?

——出在频谱的定义!

如果不是自己去推导、试验,很多人根本不知道fft变换后幅值到底表示什么。

而且,即使像这样推理了,得到一半累积振幅又有什么直接的意义呢?

根据这个值,我们可以想象出原信号是什么样的信号么?

回答是否定的,或者说,是比较难想象。

那么,频谱变换,幅值就没意义或者就这么点意义么?

那也太没意思了吧?

——对!

聪明的你,一定会想到,既然知道一半累积振幅,那么为什么不除以点数或者半点数得到原信号的振幅呢?

——对!

按照上述推理,将fft变换的幅值(绝对值)除以半点数,得到的就是信号的振幅。

这样,我们可以将上述正弦信号变为在频率10Hz处值为1,而其他频率为0(实际上matlab中fft变换结果并不是0,但非常小,可认为是0)的图像,这样,不同的人来做变换,得到的结果是不是就一样了呢?

更重要的是,如果原信号是电压信号,我们是不是可以说,从这个图上可以看出原信号是一个振幅为1V、频率为10Hz的正弦电压信号呢?

——这,是否更应该作为频谱的准确定义呢?

也许没人能回答!

因为没有书这样讲!

没有书真正从物理意义上定义过频谱!

——如果连这个最基本的问题都含糊不清、众说纷纭的话,那何谈其他的处理呢?

——以上是我,一个学了多年数字信号处理、脑筋比较死板的普通人的看法。

这个最基本最基本的问题,为何曾让我纠结那么久,曾让我那么苦闷,我实在深感痛心!

我的看法,就是那些书上讲述的太不清楚了,而频谱的定义,是否应该更多的规范一下呢?

也许我的看法有误,写在这里,一是想跟大家分享一些思考,二是——更重要的——希望大家批评指正了!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1