嘿伙计们我试图找到我记录的.wav信号的功率谱密度,这实际上是一个沉浸在噪声中的正弦。我写的函数应该记录所有1024个点的长度并用它来查找信号的Gxx,方法是找到每个记录的Gxx,然后加上它们并将它们除以下面算法中更好解释的记录数。 :
一个。逐步执行wav文件并提取第一个记录长度(例如1到1024个点)。 (请注意,记录长度是新的“N”,因此频率间距会根据此变化,而不是wav文件的总长度)。
湾在此记录上执行正常的PSD功能。
℃。存储此向量。
d。提取wav文件中的下一个1024点(例如1025:2048)并在此记录上执行PSD。
即将其添加到先前存储的记录中,并继续执行步骤c到e,直到到达wav文件的末尾或所需的记录总数。 (请记住,总记录*记录长度必须小于wavfile的总长度!)
F。将PSD除以平均数(或记录数)。 这是你的平均PSD
我创建的功能如下:
%Function to plot PSD
function[f1, GxxAv] = HW3_A_Fn_811003472_RCT(x,fs,NumRec)
Gxx = 0;
GxxAv = 0;
N = 1024;
df = fs/N;
f1 = 0:df:fs/2;
dt = 1/fs;
T = N*dt;
q = 0;
e = 1;
for i = 1:NumRec;
for r = (1+q):(N*e);
L = x(1+q:N*e);
M = length(L);
Xm = fft(L).*dt;
aXm = abs(Xm);
Gxx(1)=(1/T).*(aXm(1).*aXm(1));
for k = 2:(M/2);
Gxx(k) = (2/T) *(aXm(k).*(aXm(k)));
%Gxx = Gxx + Gxx1(k);
end
Gxx((M/2)+1)= (1/T)*(aXm((M/2)+1)).*(aXm((M/2)+1));
q = q+1024;
e = e+1;
%Gxx = Gxx + Gxx1((M/2)+1);
end
GxxAv = GxxAv + Gxx;
%Gxx = Gxx + Gxx1;
end
GxxAv = GxxAv/NumRec;
我用来调用此函数的代码如下:
[x,fs] = wavread('F:\Final\sem1Y3\Acoustics\sinenoise5s.wav');
[f1,GxxAv] = HW3_A_Fn_811003472_RCT(x,fs,100); %where 100 is the number of records to generated
plot(f1,GxxAv)
xlabel ('Frequency / Hz', 'fontsize', 18)
ylabel ('Amplitude Squared per Frequency / WU^2/Hz', 'fontsize', 18)
title ('Plot of the single sided PSD, using Averaging', 'fontsize', 18)
grid on
当试图绘制此图时,观察到以下错误:
??? Index exceeds matrix dimensions.
Error in ==> HW3_A_Fn_811003472_RCT at 19
L = x(1+q:N*e);
Error in ==> HW3_A_3_811003472_RCT at 3
[f1,GxxAv] = HW3_A_Fn_811003472_RCT(x,fs,100); %where 100 is the number of records to generated
我不知道如何解决它,我尝试了很多不同的方法,但我仍然得到这个错误。我对Matlab并不太熟悉,但我真正想要为第19行做的就是:
x(1:1024),x(1025:2048),x(2049:3072),x(3072:4096)...等到100条记录
任何想法???感谢
答案 0 :(得分:1)
这显然是家庭作业,所以我不会为你做你的工作。但是你的代码存在一些问题。首先修复所有这些:
使用更合适的函数名称,homework123
不是描述函数功能的好名称。
使用更合适的变量名称。在此上下文中的更多标准是nfft
而不是N
和n_average
而不是NumRec
。我并不关心你使用的确切内容,但它应该准确描述变量的作用。
您的错误消息明确暗示您试图以某种非法方式索引x
。首先创建一个只打印正确索引(1..1024,1025..2048,...)的循环,并确保它遵循您的指令E.只有当这按预期工作时才添加其余代码。
您使用三重嵌套for循环。您只需要一个for循环或while循环来解决此问题。