2011-12-17 7 views
-2

adpcm_encoder)を実行しようとしたときに次のメッセージが表示されました。???最大500回の再帰制限に達しました

??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N) 
to change the limit. Be aware that exceeding your available stack space can 
crash MATLAB and/or your computer. 

Error in ==> fileparts 

この問題を多くのサイトで検索しましたが、具体的な解決策が見つかりませんでした。

コードは次のとおりです。あなたがいない停止状態で自分自身を再帰的に呼び出す関数を持っているので、これが起こっている

function adpcm_y = adpcm_encoder(raw_y) 



Y = wavread('two.wav'); 
Y_en = adpcm_encoder(Y); 


IndexTable = [-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8]; 

StepSizeTable = [7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767]; 

prevsample = 0; 
previndex = 1; 

Ns = length(raw_y); 
n = 1; 

raw_y = 32767 * raw_y;   % 16-bit operation 

while (n <= Ns) 
predsample = prevsample; 
index = previndex; 
step = StepSizeTable(index); 

diff = raw_y(n) - predsample; 
if (diff >= 0) 
    code = 0; 
else 
    code = 8; 
    diff = -diff; 
end 

tempstep = step; 
if (diff >= tempstep) 
    code = bitor(code, 4); 
    diff = diff - tempstep; 
end 
tempstep = bitshift(tempstep, -1); 
if (diff >= tempstep) 
    code = bitor(code, 2); 
    diff = diff - tempstep; 
end 
tempstep = bitshift(tempstep, -1); 
if (diff >= tempstep) 
    code = bitor(code, 1); 
end 

diffq = bitshift(step, -3); 
if (bitand(code, 4)) 
    diffq = diffq + step; 
end 
if (bitand(code, 2)) 
    diffq = diffq + bitshift(step, -1); 
end 
if (bitand(code, 1)) 
    diffq = diffq + bitshift(step, -2); 
end 

if (bitand(code, 8)) 
    predsample = predsample - diffq; 
else 
    predsample = predsample + diffq; 
end 

if (predsample > 32767) 
    predsample = 32767; 
elseif (predsample < -32768) 
    predsample = -32768; 
end 

index = index + IndexTable(code+1); 

if (index < 1) 
    index = 1; 
end 
if (index > 89) 
    index = 89; 
end 

prevsample = predsample; 
previndex = index; 

adpcm_y(n) = bitand(code, 15); 
%adpcm_y(n) = code; 
n = n + 1; 
end 

答えて

8

。それは無限ループの再帰的な等価物です。

問題は、関数の2行目です:

function adpcm_y = adpcm_encoder(raw_y) 

    Y = wavread('two.wav'); 
    Y_en = adpcm_encoder(Y); 

機能の2行目は、再帰的に再び関数を呼び出しますが、何の停止条件が存在しないので、あなたが最大の再帰制限をヒットするまで、それは続きますエラー。

+0

どのようにして最大再帰制限エラーに遭遇できますか? どうすればよいですか? –

+0

@ user1103780通常、巨大な問題を再帰的に扱う正しい関数を持つことができます。または、再帰制限に常に当てはまる関数が間違っている可能性があります。あなたの関数は、最初の2行を除いて何も実行しないので、後者のカテゴリにあります。 'adpcm_y'は無限再帰を行うため、再帰制限をどのように設定するかは関係ありません。 'adpcm_y'の再帰呼び出しで何を達成しようとしているのかよく分かりませんが、今のところはあなたが望むものではないでしょう。 –

-1

は、MATLABのワークスペースでこれを試してみてください:

set(0, 'RecursionLimit', 100000) 

その後、再び、あなたのコードを実行します。

関連する問題