資料介紹
描述
在這個(gè)項(xiàng)目中,我們將使用一些特殊功能以極快的速度從 Raspberry Pi Pico 的模數(shù)轉(zhuǎn)換器 (ADC) 捕獲數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行快速傅里葉變換。這是許多項(xiàng)目的常見任務(wù),例如涉及音頻處理或無線電的項(xiàng)目。
如果您正在閱讀這篇文章,那么您很可能已經(jīng)有了一個(gè)想要從中收集數(shù)據(jù)的傳感器。就我而言,我有一個(gè)麥克風(fēng)連接到我的 Pico 的 A0 輸入。如果您只是來這里學(xué)習(xí),您可以讓模擬輸入懸空而不連接任何東西。
1. 背景
Raspberry Pi Pico 如此有用的一個(gè)主要原因是其過多的硬件功能可以將處理器從執(zhí)行常規(guī) I/O 任務(wù)中解放出來。在我們的例子中,我們將使用 Pico 的直接內(nèi)存訪問 (DMA) 模塊。這是一項(xiàng)硬件功能,可以自動(dòng)執(zhí)行涉及以極快的速度將大量數(shù)據(jù)傳入和傳出內(nèi)存到 IO 的任務(wù)。
DMA 模塊可以配置為一旦準(zhǔn)備好就從 ADC 中提取樣本。以最快的速度,您可以以高達(dá) 0.5 MHz 的頻率進(jìn)行采樣!
收集完所有這些數(shù)據(jù)后,您可能會(huì)想要對(duì)其進(jìn)行一些處理。一項(xiàng)常見任務(wù)是將您的信息從時(shí)域轉(zhuǎn)換為頻域以進(jìn)行進(jìn)一步處理。就我而言,我有一個(gè)麥克風(fēng),我想從中收集音頻樣本,然后計(jì)算樣本中包含的最大頻率分量。最常用的算法是快速傅里葉變換。
2. ADC 采樣代碼

?
如果您還沒有這樣做,我強(qiáng)烈建議您在 GitHub 上克隆 Raspberry Pi 的pico-examples庫。這是我開始使用的所有采樣代碼的地方。以下代碼的很大一部分來自此存儲(chǔ)庫中的 dma_capture 示例。
我將通過我的軟件的一些關(guān)鍵元素來解釋發(fā)生了什么。您可以在代碼部分找到完整的程序。
// set sample rate
adc_set_clkdiv(CLOCK_DIV);
這條線決定了 ADC 收集樣本的速度。“clkdiv”指的是時(shí)鐘分頻,它允許您拆分 48 MHz 基本時(shí)鐘以以較低的速率進(jìn)行采樣。目前,收集一個(gè)樣本需要 96 個(gè)周期。這會(huì)產(chǎn)生每秒 48、000、000 個(gè)周期/每個(gè)樣本 96 個(gè)周期 = 每秒 500、000 個(gè)樣本的最大采樣率。
為了更慢地采樣,您可以增加時(shí)鐘分頻。將 CLOCK_DIV 設(shè)置為 960 會(huì)使每個(gè)樣本的周期數(shù)增加 10 倍,即每秒產(chǎn)生 50、000 個(gè)樣本。您猜對(duì)了,將 CLOCK_DIV 設(shè)置為 9600 會(huì)產(chǎn)生每秒 5, 000 個(gè)樣本。
void sample(uint8_t *capture_buf) {
adc_fifo_drain();
adc_run(false);
dma_channel_configure(dma_chan, &cfg,
capture_buf, // dst
&adc_hw->fifo, // src
NSAMP, // transfer count
true // start immediately
);
gpio_put(LED_PIN, 1);
adc_run(true);
dma_channel_wait_for_finish_blocking(dma_chan);
gpio_put(LED_PIN, 0);
}
這個(gè)函數(shù)實(shí)際上是從 ADC 收集樣本。處理器復(fù)位 ADC,清空其緩沖區(qū),然后開始采樣。它還會(huì)在采樣期間打開 LED,這樣您就可以看到發(fā)生了什么。
3. FFT碼
// get NSAMP samples at FSAMP
sample(cap_buf);
// fill fourier transform input while subtracting DC component
uint64_t sum = 0;
for (int i=0;isum;i++)>+=cap_buf[i];}
float avg = (float)sum/NSAMP;
for (int i=0;ifloat;i++)>)cap_buf[i]-avg;}
上面的這一部分用來自 ADC 的樣本填充 cap_buf 數(shù)組,然后為傅里葉變換庫對(duì)其進(jìn)行預(yù)處理。對(duì)于許多應(yīng)用程序,在應(yīng)用傅里葉變換之前從數(shù)據(jù)序列中減去平均值是有利的。沒有這個(gè),任何 DC 電平(高于零的信號(hào)偏移)都會(huì)導(dǎo)致接近零的輸出頻率區(qū)間具有巨大的幅度。我使用的庫KISS FFT期望信號(hào)具有浮點(diǎn)類型,因此我還在轉(zhuǎn)換樣本的同時(shí)減去平均值。
// compute fast fourier transform
kiss_fftr(cfg , fft_in, fft_out);
// compute power and calculate max freq component
float max_power = 0;
int max_idx = 0;
// any frequency bin over NSAMP/2 is aliased (nyquist sampling theorum)
for (int i = 0; i < NSAMP/2; i++) {
float power = fft_out[i].r*fft_out[i].r+fft_out[i].i*fft_out[i].i;
if (power>max_power) {
max_power=power;
max_idx = i;
}
}
float max_freq = freqs[max_idx];
printf("Greatest Frequency Component: %0.1f Hz\n",max_freq);
下一部分計(jì)算 FFT,然后計(jì)算輸出數(shù)據(jù)中的最大頻率分量。FFT 的輸出是復(fù)值,因此要獲得可用的功率值,您可以取復(fù)數(shù)結(jié)果的大小。
另請(qǐng)注意,我們不會(huì)循環(huán)遍歷 FFT 的所有 NSAMP 輸出值,而是只對(duì) NSAMP/2 進(jìn)行 bin 處理。由于Nyquist 采樣定理,任何大于 1/2 采樣率的頻率都會(huì)混疊在一起,因此這些 bin 對(duì)我們沒有用處。這是信號(hào)處理中的一個(gè)基本結(jié)果,如果您不熟悉,值得進(jìn)一步研究!
在音頻的情況下,人耳通??梢月牭礁哌_(dá) 20 kHz 左右的頻率。我使用 960 的 CLOCK_DIV 值,產(chǎn)生 50 kHz 的采樣率。因此,我可以捕獲的最大非混疊頻率是 25 kHz,這應(yīng)該綽綽有余!
// BE CAREFUL: anything over about 9000 here will cause things
// to silently break. The code will compile and upload, but due
// to memory issues nothing will work properly
#define NSAMP 1000
最后要指出的代碼是 NSAMP,即收集的樣本數(shù)。在信號(hào)處理中,樣本數(shù)量的增加和減少之間存在基本的權(quán)衡。更多的樣本將需要更長(zhǎng)的時(shí)間來收集和處理,但會(huì)產(chǎn)生更高分辨率的傅里葉變換。更少的樣本將導(dǎo)致更短的采樣周期和更快的處理,但您的傅立葉變換將更加精細(xì)。
對(duì)于 Pico,我發(fā)現(xiàn)分配過多內(nèi)存會(huì)導(dǎo)致難以調(diào)試的故障。如果您將 NSAMP 設(shè)置得太大,您的 Pico 將沒有足夠的內(nèi)存來分配給保存樣本的數(shù)組。代碼仍然可以正常編譯和上傳,但您可能會(huì)遇到一些奇怪的行為。在我的示例中,將 NSAMP 保持在 9000 以下似乎沒問題。
3.編譯上傳
如果您還沒有這樣做,請(qǐng)下載Raspberry Pi Pico 入門。這是一個(gè)可靠的資源,可為您提供設(shè)置構(gòu)建系統(tǒng)以及編譯 C/C++ 代碼并將其上傳到 Pico 所需的一切。
下面的所有說明都適用于 macOS/Linux,但我想 CMake 在 Windows 上也有類似的過程。
- 要編譯我的代碼,首先在 GitHub 上克隆我的存儲(chǔ)庫。
- 導(dǎo)航到 adc_fft 目錄
- 創(chuàng)建一個(gè)名為“build”的目錄
- 在里面導(dǎo)航,然后輸入“cmake../”
- 輸入“make”,如果你正確安裝了 Pico 構(gòu)建系統(tǒng),一切都應(yīng)該編譯
- 將您的 Pico 置于引導(dǎo)加載程序模式,然后將 adc_fft.uf2 文件拖放到出現(xiàn)的驅(qū)動(dòng)器中
應(yīng)該就是這樣!您可以通過 USB 監(jiān)控程序的輸出。它將輸出從 A0 采樣的數(shù)據(jù)中的最大頻率分量,并且 LED 應(yīng)快速閃爍。
在我的例子中,我將麥克風(fēng)連接到模擬引腳,并通過從揚(yáng)聲器輸入麥克風(fēng)音調(diào)來驗(yàn)證我的代碼是否正確。如果您有任何問題,請(qǐng)告訴我!
- 用電機(jī)和Raspberry Pi Pico組裝人體骷髏
- 遠(yuǎn)程編程Raspberry Pi Pico
- Raspberry Pi Pico多功能入門套件
- 在Raspberry Pi Pico上連接Wi-Fi變得容易
- RP2040 Raspberry Pi Pico遇見LoRa
- Raspberry Pi Pico作為HID鼠標(biāo)
- 基于Raspberry pi pico的音量控制宏鍵盤 3次下載
- 免費(fèi)Pico模擬器上的Raspberry Pi Pico和LCD1602接口
- 使用Raspberry Pi Pico的LED序列
- Raspberry Pi Pico:使用PIO驅(qū)動(dòng)伺服
- 如何在Raspberry Pi Pico中使用OLED顯示器
- 印有PINOUT的Raspberry Pi pico分線板
- 適用于Raspberry Pi 4的Raspberry Pi Pico開發(fā)板
- 基于BME680和Raspberry Pi Pico的氣象站
- raspberry pi Pico使用MicroPython變磚后的解決方法
- 5分鐘內(nèi)將Raspberry Pi Pico變成簡(jiǎn)單的示波器+波形發(fā)生器 2318次閱讀
- 基于Raspberry Pi 5的蜂窩物聯(lián)網(wǎng)項(xiàng)目 1312次閱讀
- 使用Raspberry Pi Pico W和MicroPython開發(fā)物聯(lián)網(wǎng)應(yīng)用 2180次閱讀
- Pico W的無線功能 1085次閱讀
- 用于測(cè)試項(xiàng)目的4個(gè)最佳樹莓派Raspberry Pi模擬器 6823次閱讀
- 基于Raspberry Pi Pico的云端溫濕度監(jiān)測(cè)站設(shè)計(jì) 1986次閱讀
- 基于樹莓派產(chǎn)品 Raspberry Pi微控制器板的優(yōu)缺點(diǎn) 2984次閱讀
- 如何從Raspberry Pi Pico的模數(shù)轉(zhuǎn)換器捕獲數(shù)據(jù)計(jì)算? 2772次閱讀
- 基于Raspberry Pi Pico開發(fā)先進(jìn)的家庭自動(dòng)化系統(tǒng) 3004次閱讀
- 基于在Raspberry Pi Zero W的基礎(chǔ)上實(shí)現(xiàn)設(shè)計(jì)微型機(jī)器人 2251次閱讀
- 微雪電子ZeroW| Raspberry Pi ZeroW主板簡(jiǎn)介 2618次閱讀
- 微雪電子Raspberry Pi 3 Model主板簡(jiǎn)介 3145次閱讀
- 微雪電子Raspberry Pi 3 Model擴(kuò)展板簡(jiǎn)介 1667次閱讀
- 利用Raspberry Pi構(gòu)建存儲(chǔ)和虛擬化時(shí)間序列數(shù)據(jù) 952次閱讀
- 一文了解Raspberry Pi 4各項(xiàng)性能跑分 3w次閱讀
下載排行
本周
- 1NS1081/NS1081S/NS1081Q USB 3.0閃存數(shù)據(jù)手冊(cè)
- 0.40 MB | 4次下載 | 2 積分
- 2光伏并網(wǎng)逆變器原理
- 7.31 MB | 3次下載 | 2 積分
- 3T20電烙鐵原理圖資料
- 0.27 MB | 2次下載 | 免費(fèi)
- 4PL83081 雙路恒流同步降壓轉(zhuǎn)換器技術(shù)手冊(cè)
- 3.34 MB | 1次下載 | 免費(fèi)
- 5PL88052 4.8V至60V輸入,5A,同步降壓轉(zhuǎn)換器技術(shù)手冊(cè)
- 3.36 MB | 1次下載 | 免費(fèi)
- 6LX8201微孔霧化驅(qū)動(dòng)芯片電路圖資料
- 0.15 MB | 1次下載 | 免費(fèi)
- 7PC6200_7V直流電機(jī)驅(qū)動(dòng)器技術(shù)手冊(cè)
- 0.47 MB | 次下載 | 免費(fèi)
- 8恒溫晶體振蕩器(OCXO)FOC-2D:20.6×20.6mm在通信基站和測(cè)試設(shè)備中的應(yīng)用參數(shù)規(guī)格
- 485.75 KB | 次下載 | 免費(fèi)
本月
- 1如何看懂電子電路圖
- 12.88 MB | 329次下載 | 免費(fèi)
- 2RK3588數(shù)據(jù)手冊(cè)
- 2.24 MB | 14次下載 | 免費(fèi)
- 3PC5502負(fù)載均流控制電路數(shù)據(jù)手冊(cè)
- 1.63 MB | 12次下載 | 免費(fèi)
- 4STM32F10x參考手冊(cè)資料
- 13.64 MB | 12次下載 | 1 積分
- 5OAH0428 V1.0英文規(guī)格書
- 5.86 MB | 8次下載 | 免費(fèi)
- 6NS1081/NS1081S/NS1081Q USB 3.0閃存數(shù)據(jù)手冊(cè)
- 0.40 MB | 4次下載 | 2 積分
- 7PID控制算法學(xué)習(xí)筆記資料
- 3.43 MB | 3次下載 | 2 積分
- 8光伏并網(wǎng)逆變器原理
- 7.31 MB | 3次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935132次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191415次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183349次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81599次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73818次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65990次下載 | 10 積分
評(píng)論