Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在matlab中实现pwelch_Matlab - Fatal编程技术网

在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

我尝试在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 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);
并与matlab
pwelch

[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)