我的matlab脚本读取了一个文件夹中包含的多个wav文件。 每个读取信号都保存在单元格“ mat”中,每个信号都保存在数组中。例如, 我有3个wav文件,我读取了这些文件,并将这些信号保存在数组“ a,b和c”中。
我想应用另一个函数,该函数具有每个信号(a,b和c)以及相应名称的输入 文件。
dirMask = '\myfolder\*.wav';
fileRoot = fileparts(dirMask);
Files=dir(dirMask);
N = natsortfiles({Files.name});
C = cell(size(N));
D = cell(size(N));
for k = 1:numel(N)
str =fullfile(fileRoot, Files(k).name);
[C{k},D{k}] = audioread(str);
mat = [C(:)];
fs = [D(:)];
a=mat{1};
b=mat{2};
c=mat{3};
myfunction(a,Files(1).name);
myfunction(b,Files(2).name);
myfunction(c,Files(3).name);
end
我的脚本不起作用,因为myfunction仅考虑文件夹中包含的最后一个Wav文件,尽管 数组a,b和c共同包含三个不同的信号。
如果我只读取一个wav文件,则该脚本运行良好。 for循环有什么问题?
答案 0 :(得分:0)
就像Cris注意到的那样,您在构造for循环方面存在一些问题。您正在尝试使用“ b”和“ c”,甚至没有给它们任何数据(在循环中第二次和第三次使用)。假设您有理由按照自己的方式来构造程序(我将重写循环,以便不使用'a','b'或'c'。只需向'myfunction'发送适当的'垫”),下面的方法应该起作用:
dirMask = '\myfolder\*.wav';
fileRoot = fileparts(dirMask);
Files=dir(dirMask);
N = natsortfiles({Files.name});
C = cell(size(N));
D = cell(size(N));
a = {};
b = {};
c = {};
for k = 1:numel(N)
str =fullfile(fileRoot, Files(k).name);
[C{k},D{k}] = audioread(str);
mat = [C(:)];
fs = [D(:)];
a=mat{1};
b=mat{2};
c=mat{3};
end
myfunction(a,Files(1).name);
myfunction(b,Files(2).name);
myfunction(c,Files(3).name);
编辑
我想花点时间阐明我的意思,即我不会使用a,b或c变量。请注意,我可能在您的询问中遗漏了一些东西,因此我可能在解释您已经知道的事情。
在这样的特定情况下,可以准确地指出您将使用多少个变量。就您而言,您知道将要处理的音频文件恰好是3个。因此,变量a,b和c可以出现。很好,但是如果您必须放入另一个音频文件怎么办?现在,您需要返回并添加“ d”变量和另一个对“ myfunction”的调用。有一种更好的方法,不仅可以降低复杂性,而且可以扩展程序的功能。请参见以下代码:
%same as your code
dirMask = '\myfolder\*.wav';
fileRoot = fileparts(dirMask);
Files = dir(dirMask);
%slight variable name change, k->idx, slightly more meaningful.
%also removed N, simplifying things a little.
for idx = 1:numel(Files)
%meaningful variable name change str -> filepath.
filepath = fullfile(fileRoot, Files(idx).name);
%It was unclear if you were actually using the Fs component returned
%from the 'audioread' call. I wanted to make sure that we kept access
%to that data. Note that we have removed 'mat' and 'fs'. We can hold
%all of that data inside one variable, 'audio', which simplifies the
%program.
[audio{idx}.('data'), audio{idx}.('rate')] = audioread(filepath);
%this function call sends exactly the same data that your version did
%but note that we have to unpack it a little by adding the .('data').
myfunction(audio{idx}.('data'), Files(idx).name);
end