我实现了一个matlab代码,用于读取wav文件并对其进行一些分析。 wav文件的大小约为(3-4 G)。 当我运行该文件时,我收到以下错误:
"Out of memory. Type HELP MEMORY for your options"
我试图增加虚拟内存,但它没有用。 以下是我正在使用的代码:
event=0;
[x, fs] = wavread('C:\946707752529.wav');
Ts=1/fs;% sampling period
N = length(x);% N is the number of samples
slength = N*Ts;%slength is the length of the sound file in seconds
% Reading the first 180 seconds and find the energy, then set a threshold value
calibration_samples = 180 * fs;
[x2, Fs] = wavread('C:\946707752529.wav', calibration_samples);
Tss=1/Fs;
[b,a]=butter(5,[200 800]/(Fs/2));
y2=filter(b,a,x2);
%This loop is to find the average energy of the samples for the first 180 seconds
startSample=1;
endSample=Fs;
energy=0;
for i=1:180
energy=energy+sum(y2(startSample:endSample).^2)*Tss;
startSample=endSample+1;
endSample=endSample+Fs;
end
mean_energy=energy/180;
Reference_Energy=mean_energy;% this is a reference energy level
Threshold=0.65*Reference_Energy;
% Now filtering the whole recorded file to be between [200-800] Hz
[b,a]=butter(5,[200 800]/(fs/2));
y=filter(b,a,x);
N = length(y);
N=N/fs; % how many iteration we need
startSample=1;
endSample=fs;
energy=0;
j=1;
while( j<=N)
counter=0;
energy=sum(y(startSample:endSample).^2)*Ts;
if (energy<=Threshold)
counter=counter+1;
for k=1:9
startSample=endSample+1;
endSample=endSample+fs;
energy=sum(y(startSample:endSample).^2)*Ts;
if (energy<=Threshold)
counter=counter+1;
else
break;
end %end inner if
end % end inner for
end % end outer IF
if(counter>=10)
event=event+1;
end
if(counter>0)
j=j+counter;
else
j=j+1;
end
startSample=endSample+1;
endSample=endSample+fs;
end % end outer For
系统:Windows 7 64位
RAM:8 GB
Matlab:2013
答案 0 :(得分:2)
我猜wavread实际上将wave文件的所有数据存储到系统内存中。此外,它可能会增加额外的信息。
我看到你正在调用这个函数两次,将结果存储在不同的矩阵中,因此你的文件是3-4G,你需要至少6-8G的内存。但是你的操作系统,Matlab和其他程序也需要一些内存,这就是你出现这种内存不足错误的原因。
一种解决方案是将WAV文件分成多个文件并单独读取。另一个解决方案是只调用一次wavread,并在任何需要的地方使用加载的数据,但不为此重新分配新的内存。
答案 1 :(得分:1)
根据您的代码判断,这可能有效:
这假设您的算法正确且有效。
也可能是您的算法存在问题,要检测到这一点,请使用dbstop if error
运行代码,并在错误输出时检查所有变量的大小。然后检查其中一个是否太大,你可能发现了错误。