录音机调试第六天

关于毕设的一些调试感悟系列

1.硬件平台的搭建

用的完全是正点原子的硬件平台-阿波罗(STM32H743),所以基本不用再额外调试硬件系统,只是程序调试上需要再花一些时间进行调整。

设计的硬件系统包括LCD屏的显示、麦克风模块和SD卡存储模块

暂时发现需要改进的地方包括以下几点:

(1)对于TFT屏的显示

(2)对于SD卡的文件管理系统的调整

​ 可以这样实现,需要将两个例程放在一起,用单片机的一个管脚作为输入信号的标志位,从而让单片机执行不同的程序。(模拟出音频播放的功能来)

如果这样,那我也可以进行频谱的显示,从而来实现对音频信号的频谱分析结果。

(3)对于麦克风模块的工作模式的理解

2.软件系统的调试

软件系统包括的任务是硬件系统的中的驱动程序的编写和使用DSP库对采集的声音信号进行显示:高级一点的话,需要使用低通滤波器,对于高频噪声进行滤除。

1)TFTLCD屏-7寸 RGB TFTLCD

实现点阵显示

2)麦克风模块-WM8978

可以找到声音进入主控的接口部分,进行数据的保存,并实现FFT的数据输入

3)SD卡存储文件的管理

可以实现对存入的文件,进行访问,并进行播放

3.暂时的安排
1)读一读正点原子的开发资料,理解例程中的数据传递的流程

下面是两个开发板提供商的开源资料:

野火

原子

从上面的实验教程中挑选如下的五个实验进行应用性学习:

(1)音乐播放实验

学习利用SAI使用I2S协议驱动wm8978

通过DMA进行数据的传输:用SAI 的子模块A,其TX 是使用的DMA1 数据流 5 的通道87 来传输的;并且将DMA2 数据流3 设置为:双缓冲循环模式,外设和存储器宽度相同(16 位/32 位),并开启DMA 传输完成中断(方便填充数据)。给缓冲器填充数据需要在传输完成一次后,在中断中调用这个函数 sai_tx_callback();

wav_play_song函数,是播放 WAV的最终执行函数,该函数解析完 WAV文件后,
设置 WM8978和 I2S的参数(采样率,位数等),并开启 DMA,然后不停填充数据,实现 WAV播放,该函数还进行了按键扫描控制,实现上下取切换和暂停 /播放等操作。该函数通过判断wavtransferend是否为 1来处理是否应该填充数据,而到底填充到哪个 buf saibuf1或 saibuf2则是通过 wavwitchbuf标志来确定的,当 wavwitchbuf=0时,说明 DMA正在使用 saibuf2,程序应该填充 saibuf1;当 wavwitchbuf=1时,说明 DMA正在使用 saibuf1,程序应该填充 saibuf2

在这里插入图片描述


在这里插入图片描述

上图是I2S的通信需要配置的信号引脚定义。

(2)录音机实验

(3)SD卡的存储实验

(4)DSP实验

(5)RGB TFT显示实验

​ 调用单片机的LCD屏和TFT屏的函数库的封装是否一致呢?

(6)DMA数据传输实验:理解双缓冲含义

​ 编码后的结果,会直接由DMA传输到内存,只有等256点全部传输完才会进入到DMA的中断,这样保证了每个采样点的间隔时间都是一致的。

​ DMA发送完成中断指的是每次指定字节发送完成后便产生一个中断。

​ 为了方便接收音频数据,我们使用DMA 传输完成中断,每当一个缓冲接数据满了,硬件自动切换为下一个缓冲,同时进入中断服务函数,将已满缓冲的数据写入SD 卡的wav 文件。

对于数据传输的梳理如下:

首先声音信号经过麦克风模块,完成ADC转换(ADC转换过程),将采集的信号按照(转换后的数据存储过程)存储到SD卡中,进而完成音频信号的采集;对于音频信号的播放,主控首先从SD卡中读取(从SD卡中读取数据的过程)对应扇区的数据,然后对读取到的数据进行DAC转换(对读取到的数据进行DAC转换的过程),然后把转换后的电压值输送到麦克风集成模块中。

故而在阅读例程中需要解决两个问题:

(1)麦克风模组对于音频信号的采集方式

​ 内部ADC的转换过程:

​ 内部DAC的转换过程:

WAV是微软公司开发的一种音频格式文件,用于保存Windows平台的音频信息资源,它符合资源互换文件格式(Resource Interchange File Format, RIFF)文件规范。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种。

WAVE整体结构如表 WAVE文件结构

在这里插入图片描述

data chunk是WAVE文件主体部分,包含声音数据,一般有两个编码格式:PCM和ADPCM,ADPCM(自适应差分脉冲编码调制)属于有损压缩,现在几乎不用, 绝大部分WAVE文件是PCM编码。PCM编码声音数据可以说是在“数字音频技术”介绍的源数据,主要参数是采样频率和量化位数。绝大部分WAVE文件是PCM编码。

PCM编码声音数据可以说是在“数字音频技术”介绍的源数据,主要参数是采样频率和量化位数。

今天的分享可能有点稀疏,大体是因为数据在麦克风模块内部转换完成后,就会直接从DMA中转移到SD卡中,在转移过程中,采集的数据会被WM8978模块进行PCM编码,然后数据被以WAV格式存储到SD卡中。故而分析数据,必须从SD卡中进行数据的获取。从WAV格式的编码中,我们知道数据被放在最后,有一个统计数据大小的标志符,它的后面是采集得到的所有音频数据。在程序中利用如下函数获得起始位置:

wavx->datastart=wavx->datastart+8; //数据流开始的地方.

除此之外,我还需要知道目前在程序中采用的采样率和采集的数据位数是多少:

采样率:44.1kHz

采集的数据宽度:16bit (采集信号的实部) (对于虚部直接赋0)

在这里插入图片描述
详情可以参考这篇文章https://my.oschina.net/u/1049180/137864blog/

采集的数据量:4096

对于已经是实现的DSP频谱分析中采用的上述参数是多少:

采样率:1024hz

采集的数据宽度:32bit

采集的数据量:1024

关于f_write函数你知道多少呢?下面是它的参数定义

FRESULT f_write (
FIL* fp, /* [IN] Pointer to the file object structure /
const void
buff, /* [IN] Pointer to the data to be written /
UINT btw, /
[IN] Number of bytes to write /
UINT
bw /* [OUT] Pointer to the variable to return number of bytes written */
);

(2)SD在程序中对于数据的存储方式

​ 在SD卡中进行数据的读取:

​ 在SD卡中进行数据的写入:
例程中通过下面的函数来对SD的写入数据,所以想在这里对写入的数据进行分析。

res=f_write(f_rec,pdatabuf,SAI_RX_DMA_BUF_SIZE,(UINT)&bw);//写入文件

2)可以在网上寻找STM中DSP模块的使用

后续的安排是,转换过程中,数据的输入方式和转换过程,前提是了解到上述采集模块对于数据的处理方式。

可以先尝试把例程中的幅度谱先调试出来,然后再考虑数据的流向,从而只需要更改数据就可以了。

操作如下,将F4的显示程序,直接搬到H7的平台上,进行平台的移植。

参考网址一:https://blog.csdn.net/hduxiejun/article/details/46287341?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-17.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-17.control


close all; %Turn off all the pictures 
clc;      
% DC=1;   %The magnitude of the dc signal 
% Amp1=1; %The amplitude  of the first signal 
% Amp2=3; %The amplitude  of the second signal 
% Amp3=5; %The frequency of the third signal 
% Fre1=10;%The frequency of the first signal )
% Fre2=40;%The frequency of the Second signal 
% Fre3=80;%The frequency of the third signal 
Fs=40960; %The sampling frequency
N=4096;   %The sampling points 
t=[0:1/Fs:1]; %Sampling time
% S=DC+Amp1*sin(2*pi*Fre1*t)+Amp2*sin(2*pi*Fre2*t)+Amp3*sin(2*pi*Fre3*t); %信号
S=[

]
%Display the original signal
subplot(3,1,1);
plot(S,'b');
grid on;
xlabel('                                                                       Frequency/HZ');
ylabel('Voltage');
title('The original signal');
Y = fft(S,N);    %Do FFT transform 
Module = (abs(Y));   %:Acquire modulus
subplot(3,1,2);
F=([1:N]-1)*Fs/N; 
h = stem(F(1:N/320)/10,Module(1:N/320),'fill','--');
set(get(h,'BaseLine'),'LineStyle',':')
set(h,'MarkerFaceColor','red')
grid on;
xlabel('                                                                       FFTout[i]');
ylabel('FFT module');
title('the module value of FFT');
Module=Module/(N/2);  
Module(1)=Module(1)/2;
F=([1:N]-1)*Fs/N; 
subplot(3,1,3);
h = stem(F(1:N/320),Module(1:N/320),'fill','--');
set(get(h,'BaseLine'),'LineStyle',':')
set(h,'MarkerFaceColor','red')
grid on;
xlabel('                                                                       Frequency /HZ');
ylabel('Voltage');
title('Amplitude - frequency curves');

note: plot(x) 当x 为一向量时,以x 元素的值为纵坐标,x 的序号为横坐标值绘制曲线。

可以借助MATLAB的程序来理解博主在单片机中实现FFT的处理过程和相关信号的定义。

参考网址二:https://blog.csdn.net/ysudykx/article/details/79515134#%E7%BB%93%E6%9E%9C?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-4&spm=1001.2101.3001.4242

参考网址三:

https://www.cnblogs.com/menlsh/p/4154070.html

采样率: Fs

采样点:N = 1/Fs

频谱幅度:直流是原来的N倍,交流是原来的N/2倍

基波频率(采样分辨率):f = Fs/N 即显示频谱是的频率间隔

基4采样:输入的点数必须是4^n 即(16/64/256/1024/4096)

例程中用到函数的参数定义:

//画线
//x1,y1:起点坐标
//x2,y2:终点坐标
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)

//在指定区域内填充单个颜色
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
//color:要填充的颜色
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)

eg: LCD_Fill(0,240,0,260,WHITE);

经过一番苦心钻研,算是把频谱分析的图像做出来了,目前的实现过程是自定义了一个输入信号,如果把自定义的输入信号,换成采集的音频的数据,就可以完成频谱的显示工作了。

故暂时是有一个潜在问题,按照奈奎斯特采样定律,采样率是输入信号频率的两倍以上才可以,而输入信号的频率是100Hz~2kHz,故需要处理的数据是4096个。

3)确定调试方案的步骤

目前有两个思路来解决这个FFT转换,思路一是借助SD卡作为数据转换的媒介,需要先完成ADC转换,然后把数据存储到SD卡中,然后调用DSP中的FFT函数,分别对采集的数据的进行处理,然后并且把数据存储到另一个扇区。思路二是直接在程序中定义一个数组,然后调用FFT对数据进行处理,完成后,把数据直接存储到SD卡中。

接收数据的方式有两种,一种是在DMA中断中,进行数据的存储,因为用的是双缓存,所以需要注意的接收次序。另一种是在SD卡中,在声音播放的位置,把声音都读出来,然后进行数据的分析。

第一步,先用串口将采集到的音频数据,进行串口打印显示

实验的数据:在这里插入图片描述

利用之前的MATLAB对采集的数据进行初步分析,还算可以。

在这里插入图片描述

第二步,随后根据采集的音频数据,按照采样分辨率进行数据的频谱分析

今天需要完成程序的DSP部分的全部调试,期望能从matlab中找到合适的参数,来最终分析采集得到的音频数据。所以又可以分析为如下步骤来完成:

(1)先进行测试性验证工作,目前已经完成了左声道数据的采集工作,并且将数据用串口进行了打印输出,并用MATLAB进行了初步的验证

(2)完成整个程序框图的搭建,重点是整合DSP库、音乐播放器和录音机三个例程,并且分别验证各自独立的功能效果是否符合预期

(3)对采集的数据进行深度分析,并从中得到有用的信息

第三步,将MATLAB显示的频谱转移到LCD屏幕上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值