1

私のスクリプト内で関数を宣言するのに問題があります:

%未加工のオーディオ データを読み取る

refData = wavread('file1.wav');
userData = wavread('file2.wav'); 

% I want to continue writing my "main" function here, and call the below functions

%%%%%%%%%%%%%
% Functions %
%%%%%%%%%%%%%

%Vector x
function preEmphasis(x)
    alpha = 0.95;
    len = length(x);
    for i=1:len
        x_i = x(i);
        x_iMinus1 = x(i-1);
        x(i) = x_i - alpha*x_iMinus1;
    end
end

%Vector x
function normalization(x)
    maxVal = max(abs(x));
    x = x / maxVal;
end

%Vector x; numFrames, frameSize: integers; stepSize: percentage (float, 0.2 -> 0.5 for example)
function Ymatrix = createYmatrix(x, numFrames, frameSize, stepSize)
        Ymatrix = zeros(numFrames, frameSize);
        for i=1:numFrames
            for j=1:frameSize
                Ymatrix(i,j) = x(stepSize*i + j);
            end
        end
end

「関数」と「終了」という単語は、「解析エラー」として赤で強調表示されます。どうすればこれを修正できますか? ありがとう。

4

3 に答える 3

6

メイン スクリプト内で関数を宣言することはできません。公式ドキュメントにあるように、外部 m-file を作成し、その中に関数を実装する必要があります。

匿名でない関数は、ファイル内で定義する必要があります。

(明確にするために、スクリプトは入力引数を受け入れたり、出力引数を返したりしません)。

ただし、関数 m-file 内で宣言されたローカル関数を持つことができます。関数宣言の詳細については、公式ドキュメントを参照してください。

編集:関数 m ファイルを完全に回避する方法を探している場合は、@natan の回答を参照できます。彼は、スクリプト ファイル内で宣言できる無名関数として関数を実装しまし幸運を!

于 2013-01-16T19:32:20.570 に答える
1

スクリプトを関数に変えるだけです。次に、ローカル関数とネストされた関数を使用できます。戻り値を使用するかassignin、ベースまたは呼び出し元のワークスペースに値を戻す必要がある場合に使用します。

于 2013-01-17T02:42:22.650 に答える
1

Eitanが述べたことに加えて、ここにあなたのケースで無名関数を実装する方法があります、コードのベクトル化は必須であることに注意してください。たとえば、あなたの場合、あなたの代わりに次のようにnormalization書くことができます:

normalization = @(x) x./max(abs(x));

そしてそれを関数であるかのように使用し、y=normalization(x)

の場合preEmphasis

preEmphasis= @(x) [x(1) x(2:end)-0.95*x(1:end-1)];

現在のコードにはケースのバグがあるので、代わりにi=1それを解釈します。for=2:len

の解決策Ymatrixは少し醜いです(うまくベクトル化するのに多くの時間を費やしていません)が、うまくいくはずです:

Ymatrix = @(x, numFrames, frameSize, stepSize) ...
          ones(1,numFrames)'*x(1+stepSize:stepSize+frameSize)+...
          meshgrid(0:stepSize:stepSize*numFrames-1,ones(1,frameSize))';
于 2013-01-16T20:17:06.850 に答える