Matlab:读取多个文件

时间:2018-09-17 11:13:43

标签: matlab cell wav multiple-files

我的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循环有什么问题?

1 个答案:

答案 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