MATLAB歌曲识别器性能较差

MATLAB歌曲识别器性能较差,matlab,Matlab,这是我的MATLAB程序代码,它的工作原理如下: 我有一个包含10.mp3歌曲的文件夹(/songs)和一个包含测试文件的文件夹(/tests)。 测试只需要从/songs文件夹中剪下10秒的歌曲 我所做的是: 1) 移动到歌曲目录,并将歌曲加载到列表中 cd(path_to_songs_dir) songList = dir('*.mp3'); numSongs= numel(songList); for i=1:numSongs [y{i}, fs{i}] = audioread(

这是我的MATLAB程序代码,它的工作原理如下:

我有一个包含10.mp3歌曲的文件夹(
/songs
)和一个包含测试文件的文件夹(
/tests
)。 测试只需要从
/songs
文件夹中剪下10秒的歌曲

我所做的是:

1) 移动到歌曲目录,并将歌曲加载到列表中

cd(path_to_songs_dir)
songList = dir('*.mp3');
numSongs= numel(songList);

for i=1:numSongs
    [y{i}, fs{i}] = audioread(songList(i).name);
end
2) 负载测试文件

[y_test, fs_test] = audioread(path_to_test_file);

for g=1:numSongs
  [xc{g},lagc{g}]= xcorr(gallery{g},y_test(:,1),'none');
  if g == 1
    [maxcorr,maxli] = max(xc{g});
    n_song = g;
  elseif g ~= 1 && max(xc{g}) > maxcorr
    [maxcorr,maxli] = max(xc{g});
    n_song = g;
  end
end
3) 创建图形库

for t=1:numSongs
  gallery{t}=y{t}(:,1);
end
4) 使用互相关确定哪首歌曲与我的测试文件具有最高的互相关值

[y_test, fs_test] = audioread(path_to_test_file);

for g=1:numSongs
  [xc{g},lagc{g}]= xcorr(gallery{g},y_test(:,1),'none');
  if g == 1
    [maxcorr,maxli] = max(xc{g});
    n_song = g;
  elseif g ~= 1 && max(xc{g}) > maxcorr
    [maxcorr,maxli] = max(xc{g});
    n_song = g;
  end
end
这个程序运行得很好,而且非常擅长识别歌曲,但是速度非常慢。它可能需要整整一分钟的时间,而且只需将测试与10首歌曲进行比较


有没有办法加快速度?任何关于改进代码的建议都是值得赞赏的,这是我第一次尝试使用MATLAB

您可能应该预先计算每首歌曲的FFT。
xcorr
函数在内部使用FFT,因此是程序中最昂贵的部分。但要想让它真正快速,你需要一种完全不同的方法。这可能需要计算每首歌曲的各个部分的特征,至少要缩小歌曲的“类型”,因此您只需要与该类别的歌曲进行比较。此外,我会将歌曲数据库划分为重叠的10s片段,并与每个片段进行互相关。预先计算这些片段的FFT,然后为每个输入样本计算一个FFT,与每个数据库相乘,并确定功率(我相信高xcorr意味着FFT中的高功率)。