MATLAB歌曲识别器性能较差
这是我的MATLAB程序代码,它的工作原理如下: 我有一个包含10.mp3歌曲的文件夹(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(
/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中的高功率)。