我有一个文件夹,其文件名为:“ speaker1_001.wav”。它从001变为Speaker1_020。如何做一个for循环来“音频读取”所有文件并将值存储在具有不同名称的变量中?
这就是我得到的,但是我只获得一个变量而不是20。
mypath = fullfile('TrainVoices', 'speaker1');
for idx = 1:20
filename = fullfile(mypath, sprintf('speaker1_%d.wav', idx));
nameSpeaker = sprintf('speaker1_%d', idx);
[nameSpeaker, fs] = audioread(filename);
end
答案 0 :(得分:1)
在您的代码中,您尝试使用指令nameSpeaker
来动态创建输出变量nameSpeaker = sprintf('speaker1_%d', idx);
的名称,以便在调用audioread
时将其用作输出变量。 / p>
这是不正确的,因为您实际上是将用sprintf
创建的字符串分配给变量nameSpeaker
,而不是“更改”了它的名称。
此外,您还必须管理文件名中包含的“零”。
此错误的一部分(可以修复),通常,最好使用动态创建的变量。
一种可能的解决方案是将wav data
存储在允许动态创建字段名称的结构中。
此外,由于根据您发布的代码,您事先知道path
和inout文件的根名称,因此您可以通过简单地附加不同的字符串而不是使用{{ 1}}
在下面,您可以找到建议的解决方案的可能实现。
输出将是名为fullfile
的结构,带有一组名为nameSpeaker
,speaker1_1
,speaker1_2
...等的字段,位于为了简单起见,“零”已被删除。
每个字段都是一个结构,其字段为speaker1_3
和data
,其中包含wav文件的数据。
例如:
存储在结构中的fs
arfe的数据
speaker1_001.wav
存储在结构中的nameSpeaker.speaker1_1.data
nameSpeaker.speaker1_1.fa
arfe的数据
speaker1_002.wav
以此类推。
nameSpeaker.speaker1_2.data
nameSpeaker.speaker1_2.fs
您只需指定文件的“ idx”即可访问数据。
例如,要访问% Defina the path
mypath='TrainVoices\speaker1'
% Define the file root name
f_root_name='speaker1_'
% Define the extension of the input file\
ext='.wav'
% Loop over the input filess
for idx = 1:20
%& add the proper number of "0" to tjhe filename
if(idx <= 9)
f_name=[f_root_name '00' num2str(idx)]
else
f_name=[f_root_name '0' num2str(idx)]
end
% Build the filename
filename=fullfile(mypath,[f_name ext])
% Read the wav file
[data,fs] = audioread(filename);
% Store the wav file data in a struct
nameSpeaker.([f_root_name num2str(idx)]).data=data;
nameSpeaker.([f_root_name num2str(idx)]).fs=fs;
end
的数据,只需定义文件“ idx”,然后相应地构建字段名称:
speaker1_001.wav