Matlab: читать несколько файлов - PullRequest
0 голосов
/ 17 сентября 2018

мой скрипт matlab читает несколько файлов wav, содержащихся в папке.Каждый сигнал чтения сохраняется в ячейке «мат», а каждый сигнал сохраняется в массиве.Например, у меня есть 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 голосов
/ 17 сентября 2018

Как заметил Крис, у вас есть некоторые проблемы с тем, как вы структурировали цикл for.Вы пытаетесь использовать «b» и «c» еще до того, как им будут даны какие-либо данные (во второй и третий раз в цикле).Предполагая, что у вас есть причина для структурирования вашей программы так, как вы это делаете (я бы переписал цикл, чтобы вы не использовали «a», «b» или «c». И просто отправьте «myfunction» соответствующий индекс «»mat ') Должно работать следующее:

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
...