在matlab中实现pwelch
我尝试在matlab中实现pwelch函数 这是我的密码在matlab中实现pwelch,matlab,Matlab,我尝试在matlab中实现pwelch函数 这是我的密码 len = 65536; data = randn(1, len); overlap = 0.5; w = 256; num_w = len / (w * overlap); hamming_win = hamming(w)'; win_normal = mean(hamming_win.^2); Pxx_sum = zeros(1, w/2+1); for i = 1:num_w if
len = 65536;
data = randn(1, len);
overlap = 0.5;
w = 256;
num_w = len / (w * overlap);
hamming_win = hamming(w)';
win_normal = mean(hamming_win.^2);
Pxx_sum = zeros(1, w/2+1);
for i = 1:num_w
if i == 1
block = [zeros(1, w * (1-overlap)) data(1:w * overlap)] .* hamming_win;
else
block = data((1:w) + (i-2) * w * overlap) .* hamming_win;
end
block_fd = fft(block);
block_fd_half = block_fd(1:w/2+1);
Pxx = (block_fd_half .* conj(block_fd_half)) / (w * win_normal);
Pxx_sum = Pxx_sum + Pxx;
end
psd_avg = Pxx_sum / num_w;
figure, plot(psd_avg);
并与matlabpwelch
[psd_mat freq] = pwelch(data, w, 0.5*w);
figure, plot(psd_mat)
这里似乎存在失配增益。
如果我将最后两行替换为
psd_avg = Pxx_sum / num_w * 0.318; % <-----------
figure, plot(psd_avg);
psd\u avg=Pxx\u sum/num\u w*0.318;% 基于Ander和Daniel的评论
我回顾了我的代码,并与Octave的pwelch进行了比较
这是我发现的
我像这样删除block\u fd\u half
for i = 1:num_w
...
block_fd = fft(block);
Pxx = (block_fd .* conj(block_fd)) / (w * win_normal);
Pxx_sum = Pxx_sum + Pxx;
end
在绘制结果之前
将psd结果从两侧转换为一侧
psd_avg = Pxx_sum / num_w;
psd_avg_one_side = psd_avg(1:w/2+1) + [0, psd_avg(w:-1:w/2+2) ,0];
figure, plot(psd_avg_one_side);
这就是为什么我以前的结果在第一个频点和最后一个频点有很大的不同
经过这些修改后,我的新结果和倍频程结果完全相同
但是,与Matlab结果相比,我的新结果还有一个(2*pi)
增益不匹配
我认为这可能是使采样频率标准化的标准化因素?基于Ander和Daniel的评论
我回顾了我的代码,并与Octave的pwelch进行了比较
这是我发现的
我像这样删除block\u fd\u half
for i = 1:num_w
...
block_fd = fft(block);
Pxx = (block_fd .* conj(block_fd)) / (w * win_normal);
Pxx_sum = Pxx_sum + Pxx;
end
在绘制结果之前
将psd结果从两侧转换为一侧
psd_avg = Pxx_sum / num_w;
psd_avg_one_side = psd_avg(1:w/2+1) + [0, psd_avg(w:-1:w/2+2) ,0];
figure, plot(psd_avg_one_side);
这就是为什么我以前的结果在第一个频点和最后一个频点有很大的不同
经过这些修改后,我的新结果和倍频程结果完全相同
但是,与Matlab结果相比,我的新结果还有一个(2*pi)
增益不匹配
我认为这可能是使采样频率标准化的一个标准化因素?我怀疑您并不仅仅缺少一个数字,而是缺少的输入数据中某个等式的结果。我自己也不懂数学,Octave实现了同样的功能(但开源),可能会有所帮助。和Ander一样,我对这个函数背后的数学知识一无所知,所以我不会试图去理解它。我怀疑你没有遗漏一个数字,而是遗漏了输入数据中某个等式的结果。我自己也不懂数学,Octave实现了同样的功能(但开源),可能会有所帮助。和Ander一样,我对这个函数背后的数学没有任何线索,所以我不会试图去理解它。这个2*pi是因为默认的fs=2*pi,也就是说pHelp(数据,w)==pHelp(数据,w,[],[],[],2*pi)这个2*pi是因为默认的fs=2*pi,也就是说pHelp(数据,w)==pHelp(数据,w,[],[],2*pi)