2013-08-01 171 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)。