99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>Raspberry Pi Pico上的ADC采樣和FFT

Raspberry Pi Pico上的ADC采樣和FFT

2023-06-16 | zip | 0.00 MB | 次下載 | 2積分

資料介紹

描述

在這個項目中,我們將使用一些特殊功能以極快的速度從 Raspberry Pi Pico 的模數(shù)轉(zhuǎn)換器 (ADC) 捕獲數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行快速傅里葉變換。這是許多項目的常見任務(wù),例如涉及音頻處理或無線電的項目。

如果您正在閱讀這篇文章,那么您很可能已經(jīng)有了一個想要從中收集數(shù)據(jù)的傳感器。就我而言,我有一個麥克風(fēng)連接到我的 Pico 的 A0 輸入。如果您只是來這里學(xué)習(xí),您可以讓模擬輸入懸空而不連接任何東西。

你可以在 GitHub 上找到完整的程序。

1. 背景

Raspberry Pi Pico 如此有用的一個主要原因是其過多的硬件功能可以將處理器從執(zhí)行常規(guī) I/O 任務(wù)中解放出來。在我們的例子中,我們將使用 Pico 的直接內(nèi)存訪問 (DMA) 模塊。這是一項硬件功能,可以自動執(zhí)行涉及以極快的速度將大量數(shù)據(jù)傳入和傳出內(nèi)存到 IO 的任務(wù)。

DMA 模塊可以配置為一旦準(zhǔn)備好就從 ADC 中提取樣本。以最快的速度,您可以以高達(dá) 0.5 MHz 的頻率進(jìn)行采樣!

收集完所有這些數(shù)據(jù)后,您可能會想要對其進(jìn)行一些處理。一項常見任務(wù)是將您的信息從時域轉(zhuǎn)換為頻域以進(jìn)行進(jìn)一步處理。就我而言,我有一個麥克風(fēng),我想從中收集音頻樣本,然后計算樣本中包含的最大頻率分量。最常用的算法是快速傅里葉變換。

2. ADC 采樣代碼

pYYBAGN16dOADFXSAAk-YIIZhsU106.jpg
我的麥克風(fēng)測試臺
?

?

如果您還沒有這樣做,我強烈建議您在 GitHub 上克隆 Raspberry Pi 的pico-examples庫。這是我開始使用的所有采樣代碼的地方。以下代碼的很大一部分來自此存儲庫中的 dma_capture 示例。

我將通過我的軟件的一些關(guān)鍵元素來解釋發(fā)生了什么。您可以在代碼部分找到完整的程序。

// set sample rate
adc_set_clkdiv(CLOCK_DIV);

這條線決定了 ADC 收集樣本的速度。“clkdiv”指的是時鐘分頻,它允許您拆分 48 MHz 基本時鐘以以較低的速率進(jìn)行采樣。目前,收集一個樣本需要 96 個周期。這會產(chǎn)生每秒 48、000、000 個周期/每個樣本 96 個周期 = 每秒 500、000 個樣本的最大采樣。

為了更慢地采樣,您可以增加時鐘分頻。將 CLOCK_DIV 設(shè)置為 960 會使每個樣本的周期數(shù)增加 10 倍,即每秒產(chǎn)生 50、000 個樣本。您猜對了,將 CLOCK_DIV 設(shè)置為 9600 會產(chǎn)生每秒 5, 000 個樣本。

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);
}

這個函數(shù)實際上是從 ADC 收集樣本。處理器復(fù)位 ADC,清空其緩沖區(qū),然后開始采樣。它還會在采樣期間打開 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ù)組,然后為傅里葉變換庫對其進(jìn)行預(yù)處理。對于許多應(yīng)用程序,在應(yīng)用傅里葉變換之前從數(shù)據(jù)序列中減去平均值是有利的。沒有這個,任何 DC 電平(高于零的信號偏移)都會導(dǎo)致接近零的輸出頻率區(qū)間具有巨大的幅度。我使用的庫KISS FFT期望信號具有浮點類型,因此我還在轉(zhuǎn)換樣本的同時減去平均值。

// 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);

下一部分計算 FFT,然后計算輸出數(shù)據(jù)中的最大頻率分量。FFT 的輸出是復(fù)值,因此要獲得可用的功率值,您可以取復(fù)數(shù)結(jié)果的大小。

另請注意,我們不會循環(huán)遍歷 FFT 的所有 NSAMP 輸出值,而是只對 NSAMP/2 進(jìn)行 bin 處理。由于Nyquist 采樣定理,任何大于 1/2 采樣率的頻率都會混疊在一起,因此這些 bin 對我們沒有用處。這是信號處理中的一個基本結(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ù)。在信號處理中,樣本數(shù)量的增加和減少之間存在基本的權(quán)衡。更多的樣本將需要更長的時間來收集和處理,但會產(chǎn)生更高分辨率的傅里葉變換。更少的樣本將導(dǎo)致更短的采樣周期和更快的處理,但您的傅立葉變換將更加精細(xì)。

對于 Pico,我發(fā)現(xiàn)分配過多內(nèi)存會導(dǎo)致難以調(diào)試的故障。如果您將 NSAMP 設(shè)置得太大,您的 Pico 將沒有足夠的內(nèi)存來分配給保存樣本的數(shù)組。代碼仍然可以正常編譯和上傳,但您可能會遇到一些奇怪的行為。在我的示例中,將 NSAMP 保持在 9000 以下似乎沒問題。

3.編譯上傳

如果您還沒有這樣做,請下載Raspberry Pi Pico 入門。這是一個可靠的資源,可為您提供設(shè)置構(gòu)建系統(tǒng)以及編譯 C/C++ 代碼并將其上傳到 Pico 所需的一切。

下面的所有說明都適用于 macOS/Linux,但我想 CMake 在 Windows 上也有類似的過程。

  • 要編譯我的代碼,首先在 GitHub 上克隆我的存儲庫。
  • 導(dǎo)航到 adc_fft 目錄
  • 創(chuàng)建一個名為“build”的目錄
  • 在里面導(dǎo)航,然后輸入“cmake../”
  • 輸入“make”,如果你正確安裝了 Pico 構(gòu)建系統(tǒng),一切都應(yīng)該編譯
  • 將您的 Pico 置于引導(dǎo)加載程序模式,然后將 adc_fft.uf2 文件拖放到出現(xiàn)的驅(qū)動器

應(yīng)該就是這樣!您可以通過 USB 監(jiān)控程序的輸出。它將輸出從 A0 采樣的數(shù)據(jù)中的最大頻率分量,并且 LED 應(yīng)快速閃爍。

在我的例子中,我將麥克風(fēng)連接到模擬引腳,并通過從揚聲器輸入麥克風(fēng)音調(diào)來驗證我的代碼是否正確。如果您有任何問題,請告訴我!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1DD3118電路圖紙資料
  2. 0.08 MB   |  1次下載  |  免費
  3. 2AD庫封裝庫安裝教程
  4. 0.49 MB   |  1次下載  |  免費
  5. 3PC6206 300mA低功耗低壓差線性穩(wěn)壓器中文資料
  6. 1.12 MB   |  1次下載  |  免費
  7. 4網(wǎng)絡(luò)安全從業(yè)者入門指南
  8. 2.91 MB   |  1次下載  |  免費
  9. 5DS-CS3A P00-CN-V3
  10. 618.05 KB  |  1次下載  |  免費
  11. 6海川SM5701規(guī)格書
  12. 1.48 MB  |  次下載  |  免費
  13. 7H20PR5電磁爐IGBT功率管規(guī)格書
  14. 1.68 MB   |  次下載  |  1 積分
  15. 8IP防護等級說明
  16. 0.08 MB   |  次下載  |  免費

本月

  1. 1貼片三極管上的印字與真實名稱的對照表詳細(xì)說明
  2. 0.50 MB   |  103次下載  |  1 積分
  3. 2涂鴉各WiFi模塊原理圖加PCB封裝
  4. 11.75 MB   |  89次下載  |  1 積分
  5. 3錦銳科技CA51F2 SDK開發(fā)包
  6. 24.06 MB   |  43次下載  |  1 積分
  7. 4錦銳CA51F005 SDK開發(fā)包
  8. 19.47 MB   |  19次下載  |  1 積分
  9. 5PCB的EMC設(shè)計指南
  10. 2.47 MB   |  16次下載  |  1 積分
  11. 6HC05藍(lán)牙原理圖加PCB
  12. 15.76 MB   |  13次下載  |  1 積分
  13. 7802.11_Wireless_Networks
  14. 4.17 MB   |  12次下載  |  免費
  15. 8蘋果iphone 11電路原理圖
  16. 4.98 MB   |  6次下載  |  2 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935127次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191390次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183342次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81588次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費下載
  14. 0.02 MB  |  73815次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65989次下載  |  10 積分