2013-08-01 172 views
-3

因此,我试图使用matlab对钢琴录音执行STFT,但出现以下错误。 警告:输入参数必须是标量。MATLAB错误:内存不足

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 
+4

您是否尝试过错误建议?请为您的32位或64位版本(无论您正在使用哪个版本)提供'help memory'的输出并提供'n_of_padding'的大小。 – voxeloctree

+3

-1当你做了Matlab告诉你做的并且执行'help memory'时没有发布你得到的信息 –

回答

0

在第35行中,您尝试创建超出可用内存的数组。请注意,单独一个1×n的零数组大小为n*8字节。这意味着,如果你做出这样的阵列,称之为x,并与whos('x')检查,如:

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

你可能会发现,x为80000个字节。也许通过在你的song变量中增加一个这样的数组增加了打破记忆的最后一个字节 - 骆驼的后面。使用和whos('variableName')采取任何大小的song在行35之前,分别添加zeros(n_of_padding,1)的大小,将其转换为MB,并查看它是否超出help memory给出的最大可能的内存。

1

基于一些假设我有理由相信: - n_of_padding应该比N_window 小 - N_window小得多FS - FS是不是你的声音太高(频率,所以应该不会超过几千?!) - 你的零矩阵不会很大

这应该意味着问题不在于你创建了一个太大的矩阵,而是你已经在这个调用之前填满了内存。


如何处理此问题?

  • 第一类dbstop if error
  • 运行代码
  • 当它停检查所有变量的大小,看看那里的空间已经没有了。

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

0

Matlab上Out of memory错误最常见的含义是由于缺少连续的块而无法分配内存。这article解释了可能导致MATLAB上的Out of memory错误的各种原因。

Out of memory错误通常指向错误地执行扩展矩阵的代码(连接,超出范围的索引)。在这种情况下,MATLAB会在内存中创建一个副本,即内存的两倍大小的内存会在每次出现时消耗。

在Windows上,通过在启动过程中通过/3GB /USERVA=3030开关,可以在某种程度上缓解此问题,如here所述。这使得应用程序可以处理更多的虚拟内存(本例中为MATLAB)。