在我的脚本中声明函数时遇到一些麻烦:
%读取原始音频数据
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
单词“function”和“end”以红色突出显示为“解析错误”。我怎样才能解决这个问题?感谢。
答案 0 :(得分:6)
您无法在主脚本中声明函数。您必须创建一个外部m文件并在其中实现您的功能,就像official documentation中所述:
任何非anonymous的函数都必须在文件中定义。
(为了清楚起见,脚本不接受输入参数或返回输出参数)。
但是,您可以在函数m文件中声明本地函数。 阅读the official documentation中有关函数声明的更多信息。
编辑:如果您正在寻找一种完全避免功能m文件的方法,可以参考@ natan的答案。他将您的函数实现为anonymous functions,其中可以在脚本文件中声明。祝你好运!
答案 1 :(得分: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))';
答案 2 :(得分:1)
只需将您的脚本变成一个函数;那么你可以使用本地和嵌套函数。如果需要将值重新输入基础或调用者的工作区,请使用返回值或assignin
。