对matlab quetsions pWelch实现

70(30天)
Neraj
Neraj 2012年2月20日
编辑: 摩西 2019年5月8日
你好,
我有两个问题关于matlab的pWelch实现。我很抱歉如果我的问题已经问其他地方,但我有了漫长而艰难的回答我的问题,我还没有偶然发现了他们。所以我决定开始一个新的问题。
一些背景:我用matlab为原型。现在我想将我的代码部署在c#中所以我必须翻译从matlab。在我迈出这一步之前,我想首先将matlab的pWelch分解成其“步骤”,并确保我得到同样的结果与原始功能。我很近,但没有得到相同的结果。根据文档pWelch,人在mathworks遵循这些步骤:
1。输入信号向量x分为k重叠部分根据窗口和noverlap(或其默认值)。如果窗口大小大于FFT点数(NFFT),信号分为NFFT-length片段,然后最后一个部分是用零填充。
2。指定的窗口(或违约)应用于x的每一片段。(没有做过预处理应用窗口每段)。
3所示。一个nfft-point FFT应用于窗口的数据。
4所示。(修改后的)每个窗口的部分计算的周期图。
5。改进的周期图的设置是平均频谱估计年代(ejω)。
6。由此产生的谱估计是收缩计算功率谱密度为S (ejω)/ F, F是2π当你不提供供应采样频率时采样频率- F
我只是跟着他们的步骤,一个接一个地复制结果。然而,我的一些“归一化因素”。我的结果都乘以这个因素。和另一个区别:0赫兹,1赫兹和256赫兹组件是错误的。其他的都是正确的。这真的很令人困惑的。
我真的不把握整个“偏见与公正”的概念,但我试着乘以标准(w) ^ 2 /笔(w) ^ 2,它仍然没有解决我的问题。我注意到他们引用一本书419页: http://i.imgur.com/7mvak.png
我看了看那本书,我看到他们有不同的归一化因子。我也试过,仍然没有运气。
下面是我写的代码比较。我的数据采样在512赫兹。我正在做一个pWelch窗口长度的512点,512点FFT长度,50%重叠。使用标准的汉明窗。我用韩德尔的假数据,这样更容易让你们运行代码。
负载汉德尔;
数据= y (1:2048) ';
%汉明窗
w =汉明(512);
% preallocate psd的空间效果
mypsd = 0 (512 7);
%步骤1:遍历数据,一次512分,以256分重叠
i = 0:6
%步骤2:汉明窗
临时数据=(1 + 256 *我:我* 256 512 +)”。* w;
%步骤3:计算FFT和花上半年
temp = fft(临时);
%第四步:计算周期图”以绝对值的平方
temp = abs(临时)^ 2;
%保存在存储变量的结果
mypsd(:,我+ 1)= temp;
结束
%第五步:取所有的平均周期图
mypsd_v1 =意味着(mypsd, 2);
第六步:百分比除以采样率(我的数据512赫兹)
mypsd_v1 = mypsd_v1/512;
%扔掉第二mypsd的一半
mypsd_v1 = mypsd_v1 (1:257);
% matlab等效,使用pWelch函数
[p f] = pwelch(数据,512年,.5,512,512);
现在%计算用数据的因素,所以我的方法,
% matlab方法相匹配
norm_factor = mypsd_v1 (115) / p (115);
mypsd_v1 = mypsd_v1 / norm_factor;
%绘制结果
情节(0:长度(p) 1、日志(p),“b”),持有、情节(0:长度(p) 1、日志(mypsd_v1),“r”);
标题(sprintf (“归一化因素:% f”norm_factor));
包含(的频率(赫兹));
ylabel (“日志实力”);
%版本2:应用U因子。L =窗口长度和K = #的部分
U =(1/512) *总和(w。^ 2);
K = 7;
L = 512;
mypsd_v2 = (1 / (K * L * U)) * (mypsd, 2)总和;
mypsd_v2 = mypsd_v2 (1:257);
norm_factor = mypsd_v2 (115) / p (115);
mypsd_v2 = mypsd_v2 / norm_factor;
%绘制结果
人物,情节(0:长度(p) 1、日志(p),“b”),持有、情节(0:长度(p) 1、日志(mypsd_v2),“r”);
标题(sprintf (“归一化因素:% f”norm_factor));
包含(的频率(赫兹));
ylabel (“日志实力”);
任何帮助/指针将不胜感激!
谢谢,Neraj

答案(4)

摩西
摩西 2016年9月20日
编辑:摩西 2019年5月8日
嗨Neraj,
你有没有让你的代码的工作吗?你步骤是正确的但看起来代码的某些部分,尤其是归一化因子。我做了一些修改代码,现在显示相同的结果。
为什么这个归一化因子是供参考使用,请参考方程# 24本文档中。这是一个非常有用的和详细的论文谱密度估计和窗户。 http://holometer.fnal.gov/GH_FFT.pdf
2来自忽略多余的负频率。除以fs来自希望功率谱 密度 表达了在V ^ 2 /赫兹。的平方的总和窗口来自这样一个事实:权力是两个光谱相乘(Pxx = Px⋅Px *,⋅代表点态产品和∗代表共轭复数)。希望这有助于未来的观众这个答案。
负载汉德尔;
数据= y (1:2048) ';
%汉明窗
fs = 512;
w =汉明(512);
% preallocate psd的空间效果
mypsd = 0 (512 7);
%步骤1:遍历数据,一次512分,以256分重叠
i = 0:6
%步骤2:汉明窗
临时数据=(1 + 256 *我:我* 256 512 +)”。* w;
%步骤3:计算FFT和花上半年
temp = fft(临时);
%第四步:计算周期图”以绝对值的平方
temp = abs(临时)^ 2;
%保存在存储变量的结果
mypsd(:,我+ 1)= temp;
结束
%第五步:取所有的平均周期图
mypsd_v1 =意味着(mypsd, 2);
%扔掉第二mypsd的一半
mypsd_v1 = mypsd_v1 (1:257);
%规格化因素
mypsd_v1 = mypsd_v1 / (fs *总和(w ^ 2));
%忽略直流和奈奎斯特的价值
mypsd_v1 (2: end-1) = mypsd_v1 (2: end-1) * 2;
% matlab等效,使用pWelch函数
[pxx f] = pwelch(512年数据,w, [], fs);
图;
次要情节(2,1,1);
情节(f, mypsd_v1);
次要情节(2,1,2);
情节(f, pxx);
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2018年4月30日
四个完整的windows 512长度为2048。添加三个窗口的一半窗户偏移量、总7。基于0的索引上的是6。

登录置评。


Invizible灵魂
Invizible灵魂 2012年11月12日
你好,
为什么在接下来的代码
水稻播种期及秧龄= xper. /(2 *π);
有一个部门 2 *π 吗?
诚恳地。

韦恩王
韦恩王 2012年2月20日
嗨Neraj,你的问题和代码很长,所以我就给你一个简单的示例使用两个窗口没有重叠在一个随机向量。我先设置随机数生成器,其默认所以我可以给你最后的结果,但这并不重要。你会发现以下同意MATLAB pwelch ()。
rng默认的;
x = randn (1024 1);
Pxx = pwelch (x, 512, 0512);
水稻播种期及秧龄= 0 (512 2);
k = 0:1
x1 = x (1 + k * 512: (k + 1) * 512);
xw = x1。*汉明(512);
水稻播种期及秧龄(:,k + 1) = abs (fft (xw)) ^ 2. /规范(汉明(512),2)^ 2;
结束
水稻播种期及秧龄=意味着(水稻播种期及秧龄、2);
水稻播种期及秧龄= xper. /(2 *π);
水稻播种期及秧龄=水稻播种期及秧龄(1:长度(水稻播种期及秧龄)/ 2 + 1);
水稻播种期及秧龄(2:end-1) = 2 *水稻播种期及秧龄(2:end-1);
马克斯(abs (Pxx-xper))
你看到的最大差异绝对值的只有10 ^ (-16)。
希望这有助于
2的评论
彼得
彼得 2018年11月7日
你好韦恩,我试图概括上述代码段长度和nfft的情况不同的情况下成功nfft大于段长度。见下文,第二种情况。的情况nfft小于段长度(例1)困惑我。Matlab 2017 b的帮助表示:“如果nfft小于区段长度、段包装利用datawrap长度等于nfft。”但我不能理解这意味着什么。你能照一些灯吗?(也许通过一段代码的问号在哪里)
清晰的所有
casenr = 2
元= 1024;
开关casenr
情况下1%比nfft长段,2段
segment_length = nt / 2;
nfft = 400;
情况下2%比nfft段较短,2段
segment_length = 400;
nfft = 512;
结束
nzeropad = nfft-segment_length;
x = randn (nt, 1);
[Pxx w] = pwelch (x, segment_length 0 nfft);
水稻播种期及秧龄= 0 (nfft, 2);
k = 0:1
%将段
i1 = 1 + k * segment_length;
i2 = (k + 1) * segment_length;
x1 = x (i1: i2);
%窗口+补零:
如果nfft > = segment_length
windowlength = segment_length;
xw = [x1。*汉明(windowlength); 0 (nzeropad 1)];
elseifnfft < segment_length
% ? ? ? ? ? ? ? ? ?
结束
水稻播种期及秧龄(:,k + 1) = abs (fft (xw)) ^ 2. /规范(汉明(windowlength), 2) ^ 2;
结束
水稻播种期及秧龄=意味着(水稻播种期及秧龄、2);
水稻播种期及秧龄= xper. /(2 *π);
水稻播种期及秧龄=水稻播种期及秧龄(1:长度(水稻播种期及秧龄)/ 2 + 1);
水稻播种期及秧龄(2:end-1) = 2 *水稻播种期及秧龄(2:end-1);
马克斯(abs (Pxx-xper))

登录置评。


韦恩王
韦恩王 2012年2月22日
你复制粘贴这个代码吗?
x = randn (1024 1);
Pxx = pwelch (x, 512, 0512);
水稻播种期及秧龄= 0 (512 2);
k = 0:1
x1 = x (1 + k * 512: (k + 1) * 512);
xw = x1。*汉明(512);
水稻播种期及秧龄(:,k + 1) = abs (fft (xw)) ^ 2. /规范(汉明(512),2)^ 2;
结束
水稻播种期及秧龄=意味着(水稻播种期及秧龄、2);
水稻播种期及秧龄= xper. /(2 *π);
水稻播种期及秧龄=水稻播种期及秧龄(1:长度(水稻播种期及秧龄)/ 2 + 1);
水稻播种期及秧龄(2:end-1) = 2 *水稻播种期及秧龄(2:end-1);
马克斯(abs (Pxx-xper))
首先清楚一切在您的工作区,然后试一试。
我得到了完美的协议。你用的什么版本的MATLAB ?
4评论
Celso Coslop Barbante
Celso Coslop Barbante 2012年7月26日
还有协议。这段代码非常好理解与FFT模拟pwelch PSD估计量。我试图使用FPGA实现pwelch-like功能在硬件和FFT处理器。谢谢。

登录置评。

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!