录音机调试第五天
關于畢設的一些調試感悟系列
1.硬件平臺的搭建
用的是正點原子的硬件平臺-阿波羅(STM32H743),所以基本不用額外調試硬件系統,只是程序調試上需要多花一些時間進行調整。
設計的硬件系統包括LCD屏的顯示、WM8978模塊和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)
采集的數據量: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的寫入數據,所以想在這里對寫入的數據進行分析。
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); %信號 %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對采集的數據進行初步分析,還算可以。
第二步,隨后根據采集的音頻數據,按照采樣分辨率進行數據的頻譜分析
第三步,將MATLAB顯示的頻譜轉移到LCD屏幕上
總結
- 上一篇: 关于jesd204B调试总结
- 下一篇: 可以在中断服务程序执行malloc吗?