在 matlab 中使用 memmapfile 读取和表示 mp3 文件

Posted

技术标签:

【中文标题】在 matlab 中使用 memmapfile 读取和表示 mp3 文件【英文标题】:Read and represent mp3 files using memmapfile in matlab 【发布时间】:2015-01-10 16:04:11 【问题描述】:

我必须使用 matlab 分析生物声学音频文件。最终,我希望能够在音频中找到异常。这就是我需要找到一种可以提取和比较特征的方式来表示音频的原因。我正在处理最大 150 mb 的 mp3 文件。这些文件太大,matlab 无法读入它的内存。因此我想使用 memmapfile() 函数。我使用以下代码和一个小的 mp3 文件来了解它的实际工作原理。

[testR, ~] = audioread('test.mp3');
testM = memmapfile('test.mp3');
disp(testM.Data);
disp(testR);   

testM.Data 和 testR 的实际值不同。 Audioread() 返回一个 7483391 x 2 矩阵,memmapfile() 返回一个 4113874 x 1 矩阵。 我不太确定 memmapfile() 是如何工作的,我希望这彼此相等。有没有办法使用 memmapfile() 以与 audioread() 相同的格式读取 mp3 文件?如果是音频文件,memmapfile 实际上会返回什么?在异常检测的情况下,也许它也可以用于矢量格式?

提前致谢!

注意:原始文件采用 wav IMA ADPCM 格式,大小从 1.5 到 2.5 gb。由于 Matlab 无法处理这种格式和文件的大小,我将它们转换为 8 位 mp3 文件。

【问题讨论】:

【参考方案1】:

我认为问题在于mammapfile默认以uint8格式读取数据,而audioread函数以另一种方式读取数据。 你怎么看here你可以在用memmapfile读取的时候指定数据的格式,所以试着用不同的值“玩”。从documentation读到可以读取double格式的数据,所以尝试修改memmapfile数据格式和audioread数据格式。 最后一件事,memmapfile 总是将数据组织在矩阵中,如“somenumbers x 1”,所以如果你想要原始的,你需要使用 reshape 之类的东西。 无论如何,如果您使用大数据,我建议您尝试使用不同的东西而不是 memmapfile,因为它非常非常慢

【讨论】:

你是对的,memmapfile 不是正确的解决方案。我决定分块阅读文件。这非常有效!

以上是关于在 matlab 中使用 memmapfile 读取和表示 mp3 文件的主要内容,如果未能解决你的问题,请参考以下文章

matlab读串口数据问题

怎样在matlab中读取串口

matlab读12bit数据

matlab读路径中的文件时路径中字母不区分大小写

matlab用fread读音频文件

matlab如何实现间隔几秒钟读一次数据啊