EDN首页   博客首页

最新日志

发表于:2008-1-25 11:20:17
标签:Matlab  功率谱  

0

[zt]用matlab做经典功率谱估计

经典功率谱估计

1、直接法:
直接法又称周期图法,它是把随机序列x(n)N个观测数据视为一能量有限的序列,直接计算x(n)的离散傅立叶变换,得X(k),然后再取其幅值的平方,并除以N,作为序列x(n)真实功率谱的估计。
Matlab
代码示例:
clear;
Fs=1000; %
采样频率
n=0:1/Fs:1;
%
产生含有噪声的序列
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
window=boxcar(length(xn)); %
矩形窗
nfft=1024;
[Pxx,f]=periodogram(xn,window,nfft,Fs); %
直接法
plot(f,10*log10(Pxx));


2
、间接法:
间接法先由序列x(n)估计出自相关函数R(n),然后对R(n)进行傅立叶变换,便得到x(n)的功率谱估计。
Matlab
代码示例:
clear;
Fs=1000; %
采样频率
n=0:1/Fs:1;
%
产生含有噪声的序列
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
nfft=1024;
cxn=xcorr(xn,'unbiased'); %
计算序列的自相关函数
CXk=fft(cxn,nfft);
Pxx=abs(CXk);
index=0:round(nfft/2-1);
k=index*Fs/nfft;
plot_Pxx=10*log10(Pxx(index+1));
plot(k,plot_Pxx);


3
、改进的直接法:
对于直接法的功率谱估计,当数据长度N太大时,谱曲线起伏加剧,若N太小,谱的分辨率又不好,因此需要改进。
3.1
Bartlett
Bartlett
平均周期图的方法是将N点的有限长序列x(n)分段求周期图再平均。
Matlab
代码示例:
clear
Fs=1000;
n=0:1/Fs:1;
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
nfft=1024;
window=boxcar(length(n)); %
矩形窗
noverlap=0; %
数据无重叠
p=0.9; %
置信概率
[Pxx,Pxxc]=psd(xn,nfft,Fs,window,noverlap,p);
index=0:round(nfft/2-1);
k=index*Fs/nfft;
plot_Pxx=10*log10(Pxx(index+1));
plot_Pxxc=10*log10(Pxxc(index+1));
figure(1)
plot(k,plot_Pxx);
pause;
figure(2)
plot(k,[plot_Pxx plot_Pxx-plot_Pxxc plot_Pxx+plot_Pxxc]);


3.2
Welch
Welch
法对Bartlett法进行了两方面的修正,一是选择适当的窗函数w(n),并再周期图计算前直接加进去,加窗的优点是无论什么样的窗函数均可使谱估计非负。二是在分段时,可使各段之间有重叠,这样会使方差减小。
Matlab
代码示例:

clear;
Fs=1000;
n=0:1/Fs:1;
xn=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n));
nfft=1024;
window=boxcar(100); %
矩形窗
window1=hamming(100); %
海明窗
window2=blackman(100); %blackman

noverlap=20; %
数据无重叠
range='half'; %
频率间隔为[0 Fs/2],只计算一半的频率
[Pxx,f]=pwelch(xn,window,noverlap,nfft,Fs,range);
[Pxx1,f]=pwelch(xn,window1,noverlap,nfft,Fs,range);
[Pxx2,f]=pwelch(xn,window2,noverlap,nfft,Fs,range);
plot_Pxx=10*log10(Pxx);
plot_Pxx1=10*log10(Pxx1);
plot_Pxx2=10*log10(Pxx2);

figure(1)
plot(f,plot_Pxx);

pause;

figure(2)
plot(f,plot_Pxx1);

pause;

figure(3)
plot(f,plot_Pxx2);

 

补充:功率谱密度的定义

功率谱密度
根据维纳-欣钦定理,零均值平稳离散时间随机信号的自相关函数与其功率谱密度是一离散傅里叶变换对。
是一个零均值的平稳离散时间随机信号,其自相关函数为
                                         (9.3.12)
满足绝对可和时,即 ,则定义功率密度谱 为序列 的离散时间傅里叶变换(DFT),即
                                           (9.3.13)

        或                       (9.3.14)

其中T采样间隔。这时序列的功率密度谱 在频域是以 为周期的周期性连续函数。其离散傅里叶反变换(IDFT)为
                                      (9.3.15)
若令 ,则有
                               (9.3.16)
为了分析方便,   (9.3.14)式可以写成Z变换形式,即
                                            (9.3.17)
Z的反变换为
                                        (9.3.18)

 

互谱密度
同理,两个零均值平稳离散时间随机信号的互相关函数与其互谱密度也是一对离散傅里叶变换对。
                  (9.3.19)
                         (9.3.20)

系统分类: 自由话题   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(2695)
发表于:2008-1-15 10:34:43
标签:simulink  

0

[zt]Matlab6.5与7.0中Simulink模型的兼容问题

mdl文件在6.5里面做的,但是到了7.0里面却打不开,下面就是相关信息:

Warning: Unable to load model file 'd:\MATLAB7\work\*.mdl'.   Run "bdclose all; set_param(0, 'CharacterEncoding', Enc)" where Enc is one of windows-1252, ISO-8859-1, then load the model.   The first character that is not supported in the current character encoding setting ('ibm-1386_P100-2002') occurs on line 1795, byte offset 21. To correctly load models with non-ASCII characters, you must explicitly use the character encoding that was used to save the file.   Type "help slCharacterEncoding" for more information on setting character encoding and to learn more about which encodings are commonly found on your platform.

问题产生原因:模型中含有不能识别的字符,比如中文等等,尤其是matlab对中文的支持不是很好(不知道是不是D版的原因)。

解决的办法:

(1)在工作空间中输入下列命令,然后打开
bdclose all;
set_param(0,'CharacterEncoding','windows-1252')

或(2)在工作空间中输入下列命令,然后打开 
bdclose all 
set_param(0, 'CharacterEncoding', 'ISO-8859-1')

或(3)用写字板或记事本打开模型文件*.mdl,发现原来是有汉字不能识别,将其改为英文,存盘退出即可。 

注:可能出现问题的参数是“LastModifiedBy”,这是最后修改模型人的名字;假如你的机子装系统的时候个人名字和单位填的是中文的话就要注意了,你装matlab时默认得也是这个中文名字,如果不改的话就会出现这个问题了。所以大家尽量用英文(包括S-function的注释),以避免不必要的麻烦!

同样如果要在7.0的模型里用中文注释,然后保存,就需要 
set_param('ModelName', 'SavedCharacterEncoding', 'ISO-8859-1') 
这里ModelName是你的mdl模型名,而且必须被打开了。

几点建议:
(1)建议大家都统一用matlab7.0版本的,一些7.0.1等等如无必要,就不要装了。顺便说一下,有人说装了matlab7.0以后,系统进程里有一个Matlab Server.exe,占用内存很大,去掉的方法就是在管理工具->服务中将的启动类型由“自动”改为”禁止“就可以了。
(2)尽量避免用中文!
1)装matlab的时候,注意你的用户及单位一定要用英文或数字,不要用中文;
2)自己封装的模块名字不要用中文,模型中的注释也要用英文;
3)文件存放的路径也要用英文。

系统分类: 自由话题   |    用户分类:    |    来源: 整理

评论(0) | 阅读(511)
发表于:2007-9-11 8:45:45
标签:相位噪声  

1

‘相位噪声’

  • 简单地说,相位噪声就是短期频率稳定度的频域表征方式,如果单频信号非常稳定的话,从频谱上看其边带会随着远离主频的位置逐渐降低,一般我们比较关心偏离主频100Hz,1kHz,10kHz处的边带,若是对数坐标,此处边带的幅值与主频幅值相减,单位是dBc,再换算成单位带宽内,单位为dBc/Hz
  • 相噪表征的是信号频率的稳定度,频域上就是噪声边带,也就是相位噪声。在时域上与之对应的叫做信号的抖动
  • 频域测量相位噪声一般使用频谱分析仪,频谱分析仪可以测量偏离载频不同位置的相位噪声。相位i噪声的值是以归一化的方式给出,也就是测量的为某点的功率普密度,单位为dBc/Hz.这里C指的是CW--载波的意思,就是和载波比的频率偏差

系统分类: 测试测量   |    用户分类:    |    来源: 整理

评论(0) | 阅读(547)
发表于:2007-8-28 10:14:00
标签:dBm  dBi  dBd  dB  dBc  

1

dBm,dBi,dBd,dB,dBc

1、dBm

dBm是一个考征功率绝对值的值,计算公式为:10lgP(功率值/1mw)。

[例1] 如果发射功率P为1mw,折算为dBm后为0dBm。

[例2] 对于40W的功率,按dBm单位进行折算后的值应为:

10lg(40W/1mw)=10lg(40000)=10lg4+10lg10+10lg1000=46dBm。

2、dBi 和dBd

dBi和dBd是考征增益的值(功率增益),两者都是一个相对值,但参考基准不一样。dBi的参考基准为全方向性天线,dBd的参考基准为偶极子,所以两者略有不同。一般认为,表示同一个增益,用dBi表示出来比用dBd表示出来要大2. 15。

[例3] 对于一面增益为16dBd的天线,其增益折算成单位为dBi时,则为18.15dBi (一般忽略小数位,为18dBi)。

[例4] 0dBd=2.15dBi。

[例5] GSM900天线增益可以为13dBd(15dBi),GSM1800天线增益可以为15dBd(17dBi)。

3、dB

dB是一个表征相对值的值,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面计算公式:10lg(甲功率/乙功率)

[例6] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB。也就是说,甲的功率比乙的功率大3 dB。

[例7] 7/8 英寸GSM900馈线的100米传输损耗约为3.9dB。

[例8] 如果甲的功率为46dBm,乙的功率为40dBm,则可以说,甲比乙大6 dB。

[例9] 如果甲天线为12dBd,乙天线为14dBd,可以说甲比乙小2 dB。

4、dBc

有时也会看到dBc,它也是一个表示功率相对值的单位,与dB的计算方法完全一样。一般来说,dBc 是相对于载波(Carrier)功率而言,在许多情况下,用来度量与载波功率的相对值,如用来度量干扰(同频干扰、互调干扰、交调干扰、带外干扰等)以及耦合、杂散等的相对量值。
在采用dBc的地方,原则上也可以使用dB替代。

经验算法:
有个简便公式:0dbm=0.001w 左边加10=右边乘10
所以0+10DBM=0.001*10W 即10DBM=0.01W
故得20DBM=0.1W 30DBM=1W 40DBM=10W
还有左边加3=右边乘2,如40+3DBM=10*2W,即43DBM=20W,这些是经验公式,蛮好用的。
所以-50DBM=0DBM-10-10-10-10-10=1mw/10/10/10/10/10=0.00001mw。

系统分类: 自由话题   |    用户分类:    |    来源: 整理

评论(4) | 阅读(1991)
总共 , 当前 /