目录

  • 前言
  • 硬件
  • 软件
  • 总结

前言

这个学期学习数字信号处理,需要制作一个音乐频谱分析仪,但是本人比较菜,所以只能复刻别人做好的。

参考来自: 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制作音乐频谱分析仪相关推荐

  1. 华为怎么删除自带的音乐_原来华为手机相册隐藏剪辑功能!按下这个开关,还能制作音乐相册...

    华为手机相册你肯定在用,但除了最近删除.智能搜索之外,你还知道手机相册的其他功能吗?这里就分享一个,相册中隐藏的实用剪辑功能,按下这个开关,还能把照片制作成音乐相册. 创作开关 首先将华为手机上的相册 ...

  2. windowbuilder怎么加图片_一键制作音乐图片,这效果太惊艳了!微信这个功能简直是“宝藏”...

    试过给视频添加音乐,那你有没有试过给图片添加音乐呢?如果没有试过的话,建议你可以试试,效果绝对让你惊艳.没有加音乐的图片就只是张图片,加了音乐之后,它就有了属于自己的故事~ 一.微信自带功能 不知道大 ...

  3. 大白小课程-跟着官方教程学习Scratch3.0-P04制作音乐

    本文是视频教程:大白小课堂:跟着官方教程学习Scratch3.0系列的讲义版本,方便大家查阅 视频地址:https://www.bilibili.com/video/av54055338/ 我们今天一 ...

  4. 用python制作音乐_Python3使用PySynth制作音乐的方法

    本人虽然五音不全,但是听歌还是很喜欢的.希望能利用机器自动制作音乐,本我发现了一个比较适合入门的有趣的开源音乐生成模块 PySynth ,文我们主要讲解下如何Python3使用PySynth制作音乐. ...

  5. android相册制作,如何用手机制作音乐相册 安卓手机能不能制作音乐相册,手机制作音乐相册的方法...

    音乐相册大家应该都有自己制作过,狸窝家园也说过关于音乐相册制作的方法,但是我们一般制作音乐相册都是用电脑来进行制作的,那对于没有电脑或者是不方便使用电脑的童鞋来说就非常的不方便.针对这个问题,小编特意 ...

  6. ▷Scratch课堂丨【编程趣味卡3】制作音乐

    授权转载 | Geekid 原文作者 | Mr.炎 原文标题 | 少儿编程 教程丨Scratch编程趣味卡 - 3.制作音乐 标签:难度初级:适合年龄段:8+: Scratch介绍 Scratch融合 ...

  7. 树莓派3B qt+mplayer制作音乐播放器(10)

    内容 树莓派3B qt+mplayer制作音乐播放器:播放.暂停.上一曲.下一曲,音量调节. 平台:树莓派+qt+mplayer 1.配置 qt安装见此: https://blog.csdn.net/ ...

  8. 手机制作音乐专辑封面_你如何制作好的专辑封面

    手机制作音乐专辑封面 The best-loved albums of all time only seem to stand out in our memories (and the shelves ...

  9. winform制作音乐播放器

    winform制作音乐播放器 本文利用C# 调用Windows自带的Windows Media Player 打造一款属于自己的音乐播放器,以供学习分享使用,如有不足之处,还请指正. 概述 Windo ...

  10. arduino+无源蜂鸣器制作音乐(引入篇)——从结构到原理

    前言 之前在网上看到好多关于用单片机+无源蜂鸣器制作音乐的视频,就挺有意思的,自己就在网上买了一个KC-1206的无源电磁蜂鸣器.今天来跟大家分享一下! 蜂鸣器分为两种:无源蜂鸣器和有源蜂鸣器[a)是 ...

最新文章

  1. Flutter底部导航栏BottomNavigationBar
  2. 即点即用的office程序_10个超实用的微信小程序推荐
  3. BZOJ-3505-数三角形-CQOI2014
  4. LeetCode Algorithm 3. 无重复字符的最长子串
  5. imageNamed和imageWithContextOfFile的区别?哪个性能高
  6. php函数scandir_PHP函数glob:扫描目录文件更好的方式
  7. 你常吃的便利食品,正在加速你的衰老……研究发现饮食与DNA损伤有关
  8. matlab用solve解方程错误提示,MATLAB中使用solve解决方程组的问题
  9. Quartz调用大全
  10. 利用逆矩阵解线性方程组_线性代数入门——矩阵方程简介及一类基本矩阵方程的解法...
  11. ISO 639-1語言列表
  12. 利用独立ip在百度知道留链接方式揭秘
  13. 基于用户 的协同过滤算法
  14. 配置tracker服务
  15. oracle11服务器卸载,Oracle 11g服务器与客户端卸载、安装
  16. Go 微服务开发框架 DMicro 的设计思路
  17. 百度一下,你就知道.2
  18. ajax选项卡解析,ajax实现的选项卡
  19. python编程软件手机版下载_清辅音p的发音方法
  20. 病毒分析师,你了解多少?

热门文章

  1. poedit使用(本地化和国际化)
  2. ios 定位权限获取
  3. C语言全局变量重复定义检查-fno-common
  4. Oracle执行计划Explain Plan 如何使用
  5. Python爬取网易云音乐评论
  6. 背景建模之codebook算法
  7. Android 应用FPS测试方法介绍
  8. Tensorflow2.0---SSD网络原理及代码解析(一)
  9. 子网掩码、网络地址、广播地址的计算
  10. 远程过程调用(RPC)详解