我正在尝试使用Matlab将音频文件拆分为30毫秒不相交的间隔。我现在有以下代码:
clear all
close all
% load the audio file and get its sampling rate
[y, fs] = audioread('JFK_ES156.wav');
for m = 1 : 6000
[t(m), fs] = audioread('JFK_ES156.wav', [(m*(0.03)*fs) ((m+1)*(0.03)*fs)]);
end
但问题是我收到以下错误:
In an assignment A(I) = B, the number of elements in B and I
must be the same.
Error in splitting (line 12)
[t(m), fs] = audioread('JFK_ES156.wav', [(m*(0.03)*fs)
((m+1)*(0.03)*fs)]);
我不明白为什么B和I中的元素数量不匹配以及如何解决这个问题。我怎样才能解决这个错误?或者是否有一种更简单的方法来分割音频文件(也许是另一种我不知道的功能或其他功能)?
答案 0 :(得分:2)
我认为分割音频最简单的方法就是加载它并使用vec2mat函数。所以你会有这样的东西;
[X,Fs] = audioread('JFK_ES156.wav');
%Calculate how many samples you need to capture 30ms of audio
matSize = Fs*0.3;
%Pay attention to that apostrophe. Makes sure samples are stored in columns
%rather than rows.
output = vec2mat(x,matSize)';
%You can now have your audio split up into the different columns of your matrix.
%You can call them by using the column calling command for matrices.
%Plot first 30ms of audio
plot(output(:,1));
%You can join the audio back together using this command.
output = output(:);
希望有所帮助。这种方法的另一个好处是它可以将您的所有数据保存在一个地方!
编辑:我想到的一件事,根据您的矢量大小,您可能会遇到问题。但我认为vec2mat实际上是零填充你的矢量。不是一件大事,但如果你在两者之间来回移动,那么最好有另一个存储信号原始长度的变量。
答案 1 :(得分:1)
似乎每个30 ms的段不等于一个样本。这将是您的代码工作的唯一情况。即0.03 * fs!= 1。
您可以尝试使用单元格,即将t(m)替换为t {m}
答案 2 :(得分:1)
您应该只使用变量y并对其进行整形以形成分割音频。例如,
chunk_size = fs*0.03;
y_chunks = reshape(y, chunk_size, 6000);
这将为您提供一个矩阵,每列30毫秒块。此代码也比在循环中从文件中读取小段快。
正如hiandbaii建议您也可以使用单元格数组。确保在此之前清除现有变量。不清除数组t可能是您收到错误" Cell内容分配给非单元数组对象的原因。"
原始错误是因为您无法使用标量索引分配矢量。也就是说,' m'是一个标量,但你的audioread调用正在返回一个向量。这就是关于I和B大小不匹配的错误。你也可以通过制作一个二维数组并使用像
这样的赋值来解决这个问题。[t(m,:), fs] =