×

使用Arduino制作32波段音频频谱分析仪/可视化仪

消耗积分:2 | 格式:zip | 大小:0.06 MB | 2023-06-25

王健

分享资料个

描述

该项目用于使用 Arduino 制作 32 波段音频(音乐)频谱分析仪/可视化仪。该项目的预期受众是对电子元件、Arduino 和 C 编程有基本了解的任何音频爱好者、学生或初学者。该项目中使用的组件成本低,易于组装。

该频谱分析仪的主要特点

  • 使用易于安装的库“arduinoFFT”和“MD_MAX72xx”
  • 支持五种不同的显示模式,可以通过按钮进行切换
  • 左右声道音频信号混合,不错过任何节拍
  • 原型使用 32x8 LED 矩阵显示,可以更改和轻松修改
  • 音频可以从耳机输出或音乐系统/放大器的线路输出馈送

所需组件

  • Arduino Nano 或 Uno(我尝试使用 Nano 和 Uno,也必须使用其他型号)
  • 32 x 8 LED 矩阵显示器 - 1 无
  • 按钮开关 - 1 个(通常随 Arduino 套件一起提供)
  • 100nf 电容 - 2 个
  • 5 千欧电阻器 - 3 个
  • 10 千欧电阻 - 1 个
  • 100 千欧电阻器 - 2 个非
  • 5 伏电源(USB 电源即可)

电阻值不是很严格,您可以选择任何最接近的值。请确保 R1 和 R2(参考原理图)具有相同的值。

程序流程图

 
pYYBAGSBl2CAZ4-4AABliNhGuRw147.png
 

系统说明

Arduino 板 (ATmega328P) 内置模数转换器 (ADC),此处用于将输入音频信号转换为数字样本。ADC 配置为以 38.46khz 的时钟频率对输入信号进行采样。这是通过将 ADC 预分频器配置为 32 来实现的。38.64Khz 的采样频率意味着数字样本可以再现高达 19.32Kz(奈奎斯特定理)的输入频率,这对于音频信号来说已经足够好了。

正如我在开头提到的,该项目的预期目的是显示音频音乐信号的频谱。因此,左右音频通道混合在一起并馈入 ADC 的 A0 模拟输入。您可以使用音频分离器电缆,这样您就可以同时将相同的音乐输入频谱分析仪和另一个放大器(如果需要)。

ADC 配置为使用外部参考电压。在这个项目中,参考电压来自 Arduino 板上的 3.3v 稳定电压源。由于模拟信号在零电压电平之上和之下振荡,我们需要在 ADC 的模拟输入端提供直流偏置。这可确保 ADC 输出不会夹在输入信号的负周期上。相同的 3.3v 稳定电压被两个电阻器 R1 和 R2 分压,然后馈入模拟输入以实现直流偏置。使用此直流偏置,即使输入信号断开,ADC 也会在输出中产生 512。在代码的后面,这个由直流偏置引起的 512 被减去,这样读数就代表了实际的输入信号变化。

ArduinoFFT 库是将输入模拟信号转换为频谱的代码的核心。我发现这个库易于使用,并为这个项目生成了最准确的输出。原型被配置为制作 64 个样本,并对这些样本进行 FFT。ArduinoFFT 库可以对 16 到 128 之间的样本进行 FFT,这可以在程序中配置。但是 arduinoFFT 库对于 128 个样本的计算速度很慢,因此我坚持使用 64 个样本中最好的最高值。

该项目中使用的显示器是 32 列 x 8 行 LED 矩阵。MD_MAX72xx 库使显示控制部分变得非常简单。该库提供了打开/关闭该程序中正在使用的列中任意数量的 LED 的功能。每个频段的振幅映射在 0 到 8 之间,具体取决于振幅对应的每列中 LED 的数量被打开。

本程序提供了五种显示模式,基本上是通过打开/关闭每列不同位置的LED来实现的。您可以轻松修改/创建不同的模式。这里使用一个按钮来改变显示模式。每按一次显示模式就会移动到下一个,最后重置回默认模式。按钮连接到其中一个数字输入,并且在每一轮显示刷新后扫描该输入。

频率响应

系统的频率响应是通过馈送由在线信号发生器网站之一生成的正弦波来测试的。经验证,系统能够响应高达 18.6Khz 的频率。

 
poYBAGSBl2OAVs3wAAFRBVx-GKk919.png
 

 

 

连接输入

您可以通过多种方式将音频输入馈入此频谱分析仪。您可以将 LINE 的音频输出从音乐系统/放大器中取出。另一种选择是从移动/音乐系统的耳机输出中获取音频。我不建议使用另一个麦克风来接收音频,因为信号电平和频率响应将取决于许多因素。

这是将放大器/音乐系统的 LINE 连接到频谱分析仪的示例图。

 
pYYBAGSBl2WAf7bKAABed3d6Ej4011.png
 

下面是将移动/音乐系统的耳机输出连接到频谱分析仪的示例图。当您将电缆连接到耳机输出时,移动/音乐系统不会发出声音。因此,如果您想在可视化的同时听到音频,您可能必须拆分音频并使用另一个放大器。

 

 
poYBAGSBl2iAefoGAABe6V63CLw537.png
 

 

 


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

评论(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:'使用Arduino制作32波段音频频谱分析仪/可视化仪',//标题 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);