stm32f103c6t6制作音乐频谱分析仪
目录
- 前言
- 硬件
- 软件
- 总结
前言
这个学期学习数字信号处理,需要制作一个音乐频谱分析仪,但是本人比较菜,所以只能复刻别人做好的。
参考来自: stm32f103+FFT+OLED的音乐频谱制作(只需三步即可)
原文使用的是stm32f103c8t6,我用的是stm32f103c6t6,两个大部分引脚是通用的。我将OLED换成了四针的IIC接口。
stm32f103c6t6是自己做的最小系统板,接了一个扩展版,把oled接口和ADC采集接口引到了右边。
所有硬件软件开源地址(点这里!!!)
硬件
电路使用LM358进行放大,采用电源5V直流供电。由于单片机的ADC不能采集到负值,所以我们把信号加上了1/2Vcc的直流偏置,50倍增益可调。
本来打算做成贴片,可测试信号放大很差,信号干扰特别强,学识有限,搞不明白为什么,最后就做成插件了。
软件
stm32f103c6t6最小系统板是自己画的,包含了RTC的外部低速时钟,如果下载中No target connected或者Internal command error的问题,需要按住复位键再下载,下载的时候再松开复位键。
详细操作参考:自制stm32F103c6t6出现No target connected或者Internal command error的原因猜测和解决方法
oled引脚接口可以通过OLED.h修改
程序框架采用HAL库的形式建立,如果没学过可能有点蒙圈。使用的是PA0接口进行ADC采集。
参考链接:ADC采样的HAL配置以及程序参考
代码中主要涉及到了GUI的移植:(利用类似如下函数画柱状图)
/****************************************************************************
* 名称:GUI_LineWith()
* 功能:画任意两点之间的直线,并且可设置线的宽度。
* 入口参数: x0 直线起点的x坐标值
* y0 直线起点的y坐标值
* x1 直线终点的x坐标值
* y1 直线终点的y坐标值
* with 线宽(0-50)
* color 显示颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, TCOLOR color)
{ int32 dx; // 直线x轴差值变量int32 dy; // 直线y轴差值变量int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向int32 dx_x2; // dx*2值变量,用于加快运算速度int32 dy_x2; // dy*2值变量,用于加快运算速度int32 di; // 决策变量int32 wx, wy; // 线宽变量int32 draw_a, draw_b;/* 参数过滤 */if(with==0) return;if(with>50) with = 50;dx = x1-x0; // 求取两点之间的差值dy = y1-y0;wx = with/2;wy = with-wx-1;/* 判断增长方向,或是否为水平线、垂直线、点 */if(dx>0) // 判断x轴方向{ dx_sym = 1; // dx>0,设置dx_sym=1}else{ if(dx<0){ dx_sym = -1; // dx<0,设置dx_sym=-1}else{ /* dx==0,画垂直线,或一点 */wx = x0-wx;if(wx<0) wx = 0;wy = x0+wy;while(1){ x0 = wx;GUI_RLine(x0, y0, y1, color);if(wx>=wy) break;wx++;}return;}}if(dy>0) // 判断y轴方向{ dy_sym = 1; // dy>0,设置dy_sym=1}else{ if(dy<0){ dy_sym = -1; // dy<0,设置dy_sym=-1}else{ /* dy==0,画水平线,或一点 */wx = y0-wx;if(wx<0) wx = 0;wy = y0+wy;while(1){ y0 = wx;GUI_HLine(x0, y0, x1, color);if(wx>=wy) break;wx++;}return;}}/* 将dx、dy取绝对值 */dx = dx_sym * dx;dy = dy_sym * dy;/* 计算2倍的dx及dy值 */dx_x2 = dx*2;dy_x2 = dy*2;/* 使用Bresenham法进行画直线 */if(dx>=dy) // 对于dx>=dy,则使用x轴为基准{ di = dy_x2 - dx;while(x0!=x1){ /* x轴向增长,则宽度在y方向,即画垂直线 */draw_a = y0-wx;if(draw_a<0) draw_a = 0;draw_b = y0+wy;GUI_RLine(x0, draw_a, draw_b, color);x0 += dx_sym; if(di<0){ di += dy_x2; // 计算出下一步的决策值}else{ di += dy_x2 - dx_x2;y0 += dy_sym;}}draw_a = y0-wx;if(draw_a<0) draw_a = 0;draw_b = y0+wy;GUI_RLine(x0, draw_a, draw_b, color);}else // 对于dx<dy,则使用y轴为基准{ di = dx_x2 - dy;while(y0!=y1){ /* y轴向增长,则宽度在x方向,即画水平线 */draw_a = x0-wx;if(draw_a<0) draw_a = 0;draw_b = x0+wy;GUI_HLine(draw_a, y0, draw_b, color);y0 += dy_sym;if(di<0){ di += dx_x2;}else{ di += dx_x2 - dy_x2;x0 += dx_sym;}}draw_a = x0-wx;if(draw_a<0) draw_a = 0;draw_b = x0+wy;GUI_HLine(draw_a, y0, draw_b, color);} }
#endif
在ADC的采集中断里进行FFT计算
//ADC DMA传输中断
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{uint16_t i = 0;static uint16_t num = 0;
// printf("adc dma interrupt \r\n");HAL_ADC_Stop_DMA(&hadc1); //完成一次测量 关闭DMA传输//填充数组for(i=0;i<NPT;i++)lBufInArray[i] = ((signed short)(adc_buf[i]-2048)) << 16; //这里因为单片机的ADC只能测正的电压 所以需要前级加直流偏执/加入直流偏执后 软件上减去2048即一半 达到负半周期测量的目的cr4_fft_256_stm32(lBufOutArray, lBufInArray, NPT);//FFT变换GetPowerMag(); //取直流分量对应的AD值··········
软件也都开源在前言那里。
总结
感谢大佬的开源,让我能复刻出来,难点主要在软件,这是我头一次接触GUI移植,同时也发现GUI的强大。同时,我也发现FFT软件复现对我挺难的,只是利用现成的库,还需要加强理论学习。最后就是贴片的信号放大不明白为什么。不知道是芯片选型的问题还是电路的问题。
stm32f103c6t6制作音乐频谱分析仪相关推荐
- 华为怎么删除自带的音乐_原来华为手机相册隐藏剪辑功能!按下这个开关,还能制作音乐相册...
华为手机相册你肯定在用,但除了最近删除.智能搜索之外,你还知道手机相册的其他功能吗?这里就分享一个,相册中隐藏的实用剪辑功能,按下这个开关,还能把照片制作成音乐相册. 创作开关 首先将华为手机上的相册 ...
- windowbuilder怎么加图片_一键制作音乐图片,这效果太惊艳了!微信这个功能简直是“宝藏”...
试过给视频添加音乐,那你有没有试过给图片添加音乐呢?如果没有试过的话,建议你可以试试,效果绝对让你惊艳.没有加音乐的图片就只是张图片,加了音乐之后,它就有了属于自己的故事~ 一.微信自带功能 不知道大 ...
- 大白小课程-跟着官方教程学习Scratch3.0-P04制作音乐
本文是视频教程:大白小课堂:跟着官方教程学习Scratch3.0系列的讲义版本,方便大家查阅 视频地址:https://www.bilibili.com/video/av54055338/ 我们今天一 ...
- 用python制作音乐_Python3使用PySynth制作音乐的方法
本人虽然五音不全,但是听歌还是很喜欢的.希望能利用机器自动制作音乐,本我发现了一个比较适合入门的有趣的开源音乐生成模块 PySynth ,文我们主要讲解下如何Python3使用PySynth制作音乐. ...
- android相册制作,如何用手机制作音乐相册 安卓手机能不能制作音乐相册,手机制作音乐相册的方法...
音乐相册大家应该都有自己制作过,狸窝家园也说过关于音乐相册制作的方法,但是我们一般制作音乐相册都是用电脑来进行制作的,那对于没有电脑或者是不方便使用电脑的童鞋来说就非常的不方便.针对这个问题,小编特意 ...
- ▷Scratch课堂丨【编程趣味卡3】制作音乐
授权转载 | Geekid 原文作者 | Mr.炎 原文标题 | 少儿编程 教程丨Scratch编程趣味卡 - 3.制作音乐 标签:难度初级:适合年龄段:8+: Scratch介绍 Scratch融合 ...
- 树莓派3B qt+mplayer制作音乐播放器(10)
内容 树莓派3B qt+mplayer制作音乐播放器:播放.暂停.上一曲.下一曲,音量调节. 平台:树莓派+qt+mplayer 1.配置 qt安装见此: https://blog.csdn.net/ ...
- 手机制作音乐专辑封面_你如何制作好的专辑封面
手机制作音乐专辑封面 The best-loved albums of all time only seem to stand out in our memories (and the shelves ...
- winform制作音乐播放器
winform制作音乐播放器 本文利用C# 调用Windows自带的Windows Media Player 打造一款属于自己的音乐播放器,以供学习分享使用,如有不足之处,还请指正. 概述 Windo ...
- arduino+无源蜂鸣器制作音乐(引入篇)——从结构到原理
前言 之前在网上看到好多关于用单片机+无源蜂鸣器制作音乐的视频,就挺有意思的,自己就在网上买了一个KC-1206的无源电磁蜂鸣器.今天来跟大家分享一下! 蜂鸣器分为两种:无源蜂鸣器和有源蜂鸣器[a)是 ...
最新文章
- Flutter底部导航栏BottomNavigationBar
- 即点即用的office程序_10个超实用的微信小程序推荐
- BZOJ-3505-数三角形-CQOI2014
- LeetCode Algorithm 3. 无重复字符的最长子串
- imageNamed和imageWithContextOfFile的区别?哪个性能高
- php函数scandir_PHP函数glob:扫描目录文件更好的方式
- 你常吃的便利食品,正在加速你的衰老……研究发现饮食与DNA损伤有关
- matlab用solve解方程错误提示,MATLAB中使用solve解决方程组的问题
- Quartz调用大全
- 利用逆矩阵解线性方程组_线性代数入门——矩阵方程简介及一类基本矩阵方程的解法...
- ISO 639-1語言列表
- 利用独立ip在百度知道留链接方式揭秘
- 基于用户 的协同过滤算法
- 配置tracker服务
- oracle11服务器卸载,Oracle 11g服务器与客户端卸载、安装
- Go 微服务开发框架 DMicro 的设计思路
- 百度一下,你就知道.2
- ajax选项卡解析,ajax实现的选项卡
- python编程软件手机版下载_清辅音p的发音方法
- 病毒分析师,你了解多少?