MATLAB错误:内存不足

MATLAB错误:内存不足,matlab,Matlab,因此,我试图使用matlab在钢琴录音上执行STFT,但我得到以下错误。 警告:输入参数必须是标量 In test3 at 35 ??? Error using ==> zeros Out of memory. Type HELP MEMORY for your options. Error in ==> test3 at 35 song = cat(1,song,zeros(n_of_padding,1)); 我使用的代码取自网络上的一个示例代码 clc; clear all;

因此,我试图使用matlab在钢琴录音上执行STFT,但我得到以下错误。 警告:输入参数必须是标量

In test3 at 35
??? Error using ==> zeros
Out of memory. Type HELP MEMORY for your options.

Error in ==> test3 at 35
song = cat(1,song,zeros(n_of_padding,1));
我使用的代码取自网络上的一个示例代码

clc;
clear all;

[song,FS] = wavread('c scale fast.wav');
song = sum(song,2);
song = song/max(abs(song));

wTime = 0.05;
ZP_exp = 1;
P_OL = 50;

% Number of STFT samples per STFT slice
N_window = floor(wTime*FS);

% Number of overlapping points
window_overlap = floor(N_window*(P_OL/100));

wTime = N_window/FS;

%size checking
%make sure there are integer number of windows if not zero pad until they are
L = size(song);

%determine the number of times-1 the overlapping window will fit the song length
N_of_windows = floor(L - N_window/(N_window - window_overlap));

%determine the remainder
N_of_points_left = L - (N_window + N_of_windows*(N_window - window_overlap));

%Calculate the number of points to zero pad
n_of_padding = (N_window - window_overlap) - N_of_points_left;

%append the zeros to the end of the song
song = cat(1,song,zeros(n_of_padding,1));

clear n_of_windows n_of_points_left n_of_padding
n_of_windows = floor((L - N_window)/(N_window - window_overlap))+1;
windowing = hamming(N_window);
N_padding = 2^(nextpow2(N_window)+ZP_exp);

parfor k = 1:N_of_windows
    starting = (k-1)*(N_window -window_overlap) +1;
    ending = starting+N_window-1;

    %Define the Time of the window, i.e., the center of window
    times(k) = (starting + ceil(N_window/2))/Fs;

    %apply windowing function
    frame_sample = music(starting:ending).*windowing;

    %take FFT of sample and apply zero padding
    F_trans = fft(frame_sample,N_padding);

    %store FFT data for later
    STFT_out(:,k) = F_trans;
end

基于一些假设,我认为: -填充的n_应小于n_窗口 -N_窗口比FS小得多 -Fs不是太高(你们的声音频率,所以不应该超过几千?!) -你的零点矩阵不会很大

这意味着问题不在于您创建的矩阵太大,而在于您在调用之前已经填满了内存


如何应对

  • 第一种类型
    dbstop(如果出现错误)
  • 运行你的代码
  • 当它停止时,检查所有可变大小以查看空间的位置

如果你看不到任何奇怪的东西(而且确实需要大的存储空间),那么你可以部分处理你的歌曲。

Matlab上
内存不足
错误最常见的含义是,由于缺少连续块,它无法分配内存。此解释了可能导致MATLAB上出现
内存不足
错误的各种原因

内存不足
错误通常指向错误的代码实现,该代码动态扩展矩阵(串联,超出范围索引)。在这种情况下,MATLAB会在内存中创建一个副本,即每次这样的事件都会消耗两倍于矩阵大小的内存


在Windows上,如前所述,通过在引导期间传递
/3GB/USERVA=3030
开关,可以在一定程度上缓解此问题。这使得应用程序能够寻址额外的虚拟内存(在本例中为MATLAB)。

在第35行中,您试图创建一个超出可用内存的数组。请注意,一个1×n的零数组的大小是
n*8
字节。这意味着如果您创建了这样一个数组,请将其命名为
x
,并与
whos('x')
进行检查,如:

x = zeros(10000,1);
whos('x');

您可能会发现
x
是80000字节。也许将这样一个数组添加到您的
song
变量就是添加最后一个字节,这会破坏内存骆驼。使用和
whos('variableName')
获取第35行之前的
song
的大小,分别添加
零的大小(n_of_padding,1)
,将其转换为MB,并查看它是否超过
帮助内存
提供的最大可能内存

您是否尝试了错误建议的方法?请为您的32位或64位版本(无论您使用的是哪种版本)提供
help memory
的输出,并提供
n\u padding
-1的大小,以说明您在执行Matlab命令并执行
help memory