MATLAB audioread — проблема с вызовом одного.файл wav из структуры в ячейке

#matlab #struct #syntax #wav

#matlab #struct #синтаксис #wav

Вопрос:

введите описание изображения здесь

data_structure является ли ячейка (длина (num_sounds) ячейка строки x 3 столбца

  • каждая строка соответствует другому звуку
  • первый столбец = имя каталога
  • второй столбец = структура файлов для файлов .wav
  • третий столбец = формантные данные

    for i=1:num_sounds;
    cd(char(sound_dirs{i})); %open a directory
    wav_list=dir('*.wav'); %get all the .wav files in the folder
    data_structure{i,2}=wav_list; % fills second column with struct the length of the .wav files.
    data_structure{i,1}=words{i};
    end

проблема заключается здесь

  for i=1:num_sounds;
        num_wavs=length(data_structure{i,2}); 
        for i=1:num_wavs;
            [y Fs]= audioread((data_structure{i,2}.name)); %%problem here
 

Я понимаю, что проблема в том, что я вызываю все файлы ‘.wav’ в одной папке одновременно и не беру каждый по одному

Я попытался data_structure{1,2}.name(40); % the first folder has 47 .wav files

но это не сработало.

name <— содержит все имена .файлы wav.

введите описание изображения здесь

Комментарии:

1. data_structure{1,2}(40).name

2.Я попробовал это for i=1:num_sounds; i_num_wavs=length(data_structure{i,2}); for j=1:i_num_wavs; [y Fs]= audioread(data_structure{i,2}(j).name); end end , я использовал предложение @CrisLuengo, и оно сработало в окне командной строки, но оно все равно не будет запускаться в скрипте.

3.ошибка Error using audioread (line 90) The filename specified was not found in the MATLAB path. Error in celldir (line 37) [y Fs]= audioread(data_structure{i,2}(j).name);

4. Не используйте cd . Вы попадаете в последний каталог, поэтому все файлы, которые вы читаете, оттуда. Используйте fullfile(directory_name,file_name) как при перечислении содержимого каталога (где file_name находится *.wav ), так и при чтении файла.

5. Я начал писать ответ на ваш новый вопрос, но он был удален. Теперь это ясно? Я предлагаю wav_list=dir(fullfile(char(sound_dirs{i}),'*.wav')); и audioread(fullfile(char(sound_dirs{i}),data_structure{i,2}.name)) .

Ответ №1:

В очереди

 [y Fs] = audioread((data_structure{i,2}.name)); %%problem here
 

выражение data_structure{i,2}.name будет передавать все имена файлов (47 в вашем примере) сразу в качестве входных аргументов функции audioread , отсюда и сообщение об ошибке.

Если вы хотите получить доступ к каждому .wav файлу по отдельности, вам необходимо проиндексировать их в структуре, возвращенной из dir , т.е.,

 for i=1:num_sounds;
    these_files = data_structure{i,2};
    for i=1:length(these_files)
        [y Fs] = audioread(these_files(i).name));
        % Do whatever needs to be done with y, Fs
    end
end