When using cpsd to calculate the cross power spectral density, I've noticed that the plot produced by directly running the command with no output arguments is slightly different from what I get when I run it with an output argument and plot that output myself.
The following code (attached along with example signal file) produces the figure below.
signalx = randn(2e4,1);
signaly = randn(2e4,1);
window = length(signalx)/3;
noverlap = round(0.9*window);
fs = 2074;
[Pxy,F] = cpsd(signalx,signaly,window,noverlap,[],fs);
plot(F./1000,10.*log10(real(Pxy)))
hold on
cpsd(signalx,signaly,window,noverlap,[],fs);
legend('CPSD output','CPSD direct plot')
I'm trying to run cpsd column-wise on a pair of very large matrices. Obviously I can't just plot them one by one, but I don't know how to interpret this difference and I'm not sure if I trust the output argument. Does anyone know what's going on here? Thanks!

 採用された回答

Voss
Voss 2024 年 8 月 1 日
編集済み: Voss 2024 年 8 月 1 日

0 投票

Looks like cpsd with no outputs plots the magnitude, abs(Pxy), rather than the real part, real(Pxy).
signalx = randn(2e4,1);
signaly = randn(2e4,1);
window = length(signalx)/3;
noverlap = round(0.9*window);
fs = 2074;
[Pxy,F] = cpsd(signalx,signaly,window,noverlap,[],fs);
Warning: Rounding order to nearest integer.
% use a thick line so it can be seen underneath the thin line on top
plot(F./1000,10.*log10(abs(Pxy)),'--','LineWidth',2)
hold on
cpsd(signalx,signaly,window,noverlap,[],fs);
Warning: Rounding order to nearest integer.
legend('CPSD output','CPSD direct plot')
% zoom in to see that the lines match
xlim([0 0.01])

2 件のコメント

DLR
DLR 2024 年 9 月 4 日
Thank you!!
Voss
Voss 2024 年 9 月 5 日
You're welcome!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

製品

リリース

R2024a

質問済み:

DLR
2024 年 8 月 1 日

コメント済み:

2024 年 9 月 5 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by