×

基于树莓派的音频频谱图可视化设备

消耗积分:0 | 格式:rar | 大小:0.59 MB | 2022-12-23

香香技术员

分享资料个

方案介绍

使用 Raspberry Pi Pico、数字麦克风和 LCD 显示器创建实时音频频谱图可视化器。

本项目将介绍如何使用带有外部数字麦克风和 TFT LCD 显示屏的Raspberry Pi Pico板创建实时音频频谱图可视化器。它将让您看到周围音频环境的实时视觉表现。

FkTdZT5fqiqzTd7zkuAuhg098DkY

什么是音频频谱图?
音频频谱图用于将随时间的幅度表示的音频信号可视化为显示信号中包含的频率如何随时间变化的格式。

在下图中,左侧显示原始音频信号,右侧显示音频信号的音频频谱图。

FkkDbujeIOHx7RJUfrnw3HMEfcjH

您可以通过频谱图中的颜色强度看到音频信号的幅度与该信号中相关频率之间的直接相关性。

频谱图还使用基于机器学习 (ML) 的音频系统,将音频信号转换为频谱图,以便计算机视觉技术可用于对音频信号的二维“图像表示”进行分类。现实世界的例子包括音频或语音识别,以及关键字识别。

渲染流水线
要创建频谱图并将其实时显示在 LCD 显示屏上,需要执行以下步骤:

1. 从数字麦克风中收集 N 个音频样本。

2. 对收集的音频样本应用汉宁窗。

3. 使用上一步的输入运行真正的快速傅立叶变换 (RFFT)。

4. 计算 RFFT 的幅度。

5. 将每个 RFFT 幅度映射到一个颜色值以显示在 LCD 显示屏上。

6. 在 LCD 上显示新行。

7. 滚动到新行并重复。

如果我们选择 256 的 RFFT 大小,我们将有 128 个可用幅度输出显示在屏幕上,因为这小于显示器每行的 240 个像素,我们可以每行显示两次以最大化视觉空间显示器。

为了获得更快的视觉响应时间,我们可以一次从麦克风中收集 64 个新的音频样本(而不是等待 256 个新的样本),并将它们与之前每个周期的最新 192 (= 256 - 64) 个样本结合起来。采样率为 16 kHz,我们将有 64 / 16, 000 秒来执行所有计算并更新显示。这导致每次迭代 4 毫秒。

我们将使用Pico 麦克风库从数字麦克风中捕获数据。Arm 的 CMSIS-DSP 库将用于实时处理音频数据。CMSIS-DSP 针对Arm Cortex-M 处理器进行了优化,包括Arm Cortex-M0+ ,Raspberry Pi Pico 的 RP2040 微控制器 (MCU) 就是基于该处理器。在ST7789库微微将被用于驱动TFT ST7789显示器的输出。

硬件设置
将公头焊接到您的 Raspberry Pi Pico 板上、Adafruit PDM MEMS 麦克风分线板和2" 320x240 彩色 IPS TFT 显示器和 microSD 卡分线板,以便它们可以插入面包板。请参阅 MagPi 的“如何焊接 GPIO引脚接头到 Raspberry Pi Pico”指南,了解有关将引脚接头焊接到 Raspberry Pi Pico 板的更多详细信息。

焊接完两个部件后,将它们放在面包板上并按如下方式设置接线:

表格形式的接线设置:

FiP3T_Dff7KILtxM7FcuWRKB6EI6

之后你的面包板应该是这样的:

搭建 Pico SDK 开发环境
您首先需要使用 Raspberry Pi 的 Pico SDK 和所需的工具链设置您的计算机。

有关详细信息,请参阅“ Raspberry Pi Pico 入门” 。

获取和编译 pico-audio-spectrogram 应用程序

确保PICO_SDK环境变量已设置。

FjLzWbufkOsxsVQq5ZjflwECKw-U

在终端窗口中,克隆 git 存储库并更改目录:

Fl4BBzdPpZT1OQKJHT0UbeFB_c0Z

创建一个构建目录并将目录更改为它:

FumimDP_x0qe0VLlrN2La5CQBi8i

运行cmake和make进行编译:

FuW9nGI7IUDTvxFqOH-fKJk9VJTo

按住板上的BOOTSEL按钮,同时使用 USB 电缆将板插入计算机。

将audio_spectrogram.uf2文件复制到挂载的 Raspberry Pi Pico 启动 ROM 磁盘:

FoN2GG_7C2A1irFaetm6BUdnhhGI

测试一下
您现在可以尝试各种声音,包括说出不同的单词,以查看它们在频谱图上的实时外观。

以下是在显示屏上说出“是”一词的示例:

同样,这就是说“不”这个词在显示屏上的样子:

可以在下面找到“ESC-50:环境声音分类数据集”中各种声音的示例:

结论
本方案介绍了如何使用带有外部数字麦克风和 TFT LCD 的 Raspberry Pi Pico 板来创建实时音频频谱图可视化器。该项目使用Microphone Library for Pico从麦克风一次捕获 64 个音频样本,然后使用Arm 的 CMSIS-DSP 库将音频样本转换为频谱图,然后使用Pico的ST7789 库。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'基于树莓派的音频频谱图可视化设备',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);