-3

因此,我尝试使用 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
4

3 回答 3

1

基于一些假设,我会推断: - n_of_padding 应该小于 N_window - N_window 小得多 FS - Fs 不是太高(你的声音频率,所以不应该超过几千?!) - 你的 zeros 矩阵不会变得巨大

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


如何处理?

  • 第一类dbstop if error
  • 运行你的代码
  • 当它停止时,检查所有可变大小以查看空间的去向。

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

于 2013-08-01T14:33:09.197 回答
0

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

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

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

于 2013-08-01T14:42:14.700 回答
0

在第 35 行,您尝试创建一个超出可用内存的数组。请注意,仅 1 x 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.

于 2013-08-01T14:44:14.680 回答