#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