色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于OpenHarmony音符檢測實現原理

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-03-04 14:11 ? 次閱讀

一、音符檢測的基本原理

本文基于 OpenHarmony 開源系統提供了一種音符檢測的原理方法,結合多首音樂,運用了 pythonC++ 兩種編程環境實現了預期的檢出效果。旨在為振動馬達(vibrator)提供音樂節奏感的觸覺效果,代碼所在目錄 .basesensorssensorvibration_convert。
先從 python 實現說起,Librosa 關于音符檢測主要用到了兩個函數,一個是 onset_strength(),負責生成包含音符產生的頻率突變的包絡線,如藍色線條所示。另一個是 onset_detect(),主要運用峰點檢測找到每個音符的位置,如黃色線條所示。

wKgaomXlZYGAFXnaAABb5yREx1M173.png

圖 1 音符檢測包絡圖
包含有用的頻率突變的包絡線是音符檢測的核心所在。傅里葉變換能夠得到全部信號采樣的頻譜圖,即每個頻率的能量貢獻,如圖 2 所示。但是每個時刻頻譜圖卻得不到,于是將全部采樣分割成若干固定長度的窗口,每個窗口應用傅里葉變化,從而得到這一窗口的頻率分布,水平軸為時間,縱軸為頻率,顏色代表能量大小如圖 3 所示。

wKgaomXlZYyAM2TyAAEB9yNvDhE741.png

圖 2 整體頻率分布圖

wKgZomXlZZSAe0yJAAD7p26QOxU376.png

圖 3 時頻圖

每種樂器在音符產生時,前后時間片段的頻率將會發生明顯變化,如圖 4 所示。于是將時頻圖相鄰列做差分,將明顯看到變化的頻率。為了便于分析,只取正值,具有相同的效果,所以負值填零。一個時刻變化的頻率有多個,如何取舍,有三種方法,平均數、中位數和聯合,目前常用到的是中位數和平均數。至此,將得到任意時刻發生明顯頻率變化的單一能量,如圖 1 藍色線條所示。

wKgZomXlZZ-AEtbhAAHWnp2I_N4398.png

wKgaomXlZaaAKBeVAAGm96w0PNM342.png

圖 4 時頻圖相鄰列差分前后變化

二、音符檢測的準確性

目前采用頻譜光通量(相鄰列差分)方法檢測是業界公認且較為準確的方法,音符檢出率僅為 70% 多。不準確的原因可能有樂器多且差異較大,信號衰減對性能的影響,顫音影響,峰點檢測時不同參數的影響,這些主要是針對音樂的研究。

三、音符檢測的程序流程

3.1 程序實現

音符檢測功能核心就是頻譜圖和梅爾濾波器,頻譜圖的核心就是短時傅里葉變換,C++ 代碼片段如下,參考鏈接 https://github.com/kooBH/STFT/blob/main/cpp/STFT.h

void STFT::stft(short*in,int length,double**out){ int i,j; /*** Shfit & Copy***/ for (j = 0; j < channels; j++) { for (i = 0; i < ol; i++) { buf[j][i] = buf[j][i + shift_size]; } } // EOF if(length!=shift_size*channels){ length = length/channels; for (i = 0; i < length; i++) { for (j = 0; j < channels; j++) buf[j][i + ol] = (double)(in[i * channels+ j]); } for (i = length; i < shift_size; i++) { for (j = 0; j < channels; j++) buf[j][i + ol] = 0; } //continue }else{ for (i = 0; i < shift_size; i++) { for (j = 0; j < channels; j++){ buf[j][i + ol] = (double)(in[i * channels+ j]); } } } /*** Copy input -?> hann_input buffer ***/ for (i = 0; i < channels; i++) memcpy(out[i], buf[i], sizeof(double) * frame_size); // scaling for precision if(opt_scale) for (i = 0; i < channels; i++) for (j = 0; j < frame_size; j++) out[i][j] /= MATLAB_scale; /*** Window ***/ hw-?>Process(out, channels); /*** FFT ***/ fft->FFT(out); } void STFT::stft(short*in,int length,double**out){ int i,j; /*** Shfit & Copy***/ for (j = 0; j < channels; j++) { for (i = 0; i < ol; i++) { buf[j][i] = buf[j][i + shift_size]; } } // EOF if(length!=shift_size*channels){ length = length/channels; for (i = 0; i < length; i++) { for (j = 0; j < channels; j++) buf[j][i + ol] = (double)(in[i * channels+ j]); } for (i = length; i < shift_size; i++) { for (j = 0; j < channels; j++) buf[j][i + ol] = 0; } //continue }else{ for (i = 0; i < shift_size; i++) { for (j = 0; j < channels; j++){ buf[j][i + ol] = (double)(in[i * channels+ j]); } } } /*** Copy input -?> hann_input buffer ***/ for (i = 0; i < channels; i++) memcpy(out[i], buf[i], sizeof(double) * frame_size); // scaling for precision if(opt_scale) for (i = 0; i < channels; i++) for (j = 0; j < frame_size; j++) out[i][j] /= MATLAB_scale; /*** Window ***/ hw-?>Process(out, channels); /*** FFT ***/ fft->FFT(out); }

Mel 濾波器構造代碼如下:

if fmax is None: fmax = float(sr) / 2 # Initialize the weights n_mels = int(n_mels) weights = np.zeros((n_mels, int(1 + n_fft // 2)), dtype=dtype) # Center freqs of each FFT bin fftfreqs = fft_frequencies(sr=sr, n_fft=n_fft) # 'Center freqs' of mel bands - uniformly spaced between limits mel_f = mel_frequencies(n_mels + 2, fmin=fmin, fmax=fmax, htk=htk) fdiff = np.diff(mel_f) ramps = np.subtract.outer(mel_f, fftfreqs) for i in range(n_mels): # lower and upper slopes for all bins lower = -ramps[i] / fdiff[i] upper = ramps[i + 2] / fdiff[i + 1] # .. then intersect them with each other and zero weights[i] = np.maximum(0, np.minimum(lower, upper)) if norm == "slaney": # Slaney-style mel is scaled to be approx constant energy per channel enorm = 2.0 / (mel_f[2 : n_mels + 2] - mel_f[:n_mels]) weights *= enorm[:, np.newaxis] else: weights = util.normalize(weights, norm=norm, axis=-1) # Only check weights if f_mel[0] is positive if not np.all((mel_f[:-2] == 0) | (weights.max(axis=1) > 0)): # This means we have an empty channel somewhere warnings.warn( "Empty filters detected in mel frequency basis. " "Some channels will produce empty responses. " "Try increasing your sampling rate (and fmax) or " "reducing n_mels.", stacklevel=2, ) return weights

3.2 功能流程圖

wKgaomXlZbmAJyEVAAGDpuE3K4Q224.png


為了能讓大家更好的學習鴻蒙 (OpenHarmony) 開發技術,這邊特意整理了《鴻蒙 (OpenHarmony)開發學習手冊》,希望對大家有所幫助:

《鴻蒙(Harmony OS)開發學習手冊》

入門必看:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應用開發導讀(ArKTS)
2.……

wKgaomXW6N2AJp9uAAQXRxEAprs547.png

HarmonyOS概念:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.系統定義
2.技術框架
3.技術特性
4.系統安全

wKgaomXW6OSAFcCRAAV2zd2X_1s891.png

快速入門:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.基本概念
2.構建第一個ArkTS應用
3.……

wKgZomXW6PuAA7wEAAKx6By_2Z8377.png

開發基礎知識:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應用基礎知識
2.配置文件
3.應用數據管理
4.應用安全管理
5.應用隱私保護
6.三方應用調用管控機制
7.資源分類與訪問
8.學習ArkTS
9…

wKgZomXW6QaAM4niAAQzrXUUPik914.png

基于ArkTS 開發:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.Ability開發
2.UI開發
3.公共事件與通知
4.窗口管理
5.媒體
6.安全
7.網絡與鏈接
8.電話服務
9.數據管理
10.后臺任務(Background Task)管理
11.設備管理
12.設備使用信息統計
13.DFX
14.國際化開發
15.折疊屏系列
16………

wKgZomXW6RKATahiAAKz-zSMnR4040.png



審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    57

    文章

    2339

    瀏覽量

    42816
  • HarmonyOS
    +關注

    關注

    79

    文章

    1973

    瀏覽量

    30145
  • OpenHarmony
    +關注

    關注

    25

    文章

    3713

    瀏覽量

    16256
收藏 人收藏

    評論

    相關推薦

    通過WebSocket操作OpenHarmony機器

    OpenHarmony機器人中運行 ArkTS APP,在APP中通過WebScoket客戶端接收指令,然后調用機器人接口實現相關動作。
    發表于 11-27 16:41

    第三屆OpenHarmony技術大會星光璀璨、致謝OpenHarmony社區貢獻者

    10月12日,在上海舉辦的第三屆OpenHarmony技術大會上,32家高校OpenHarmony技術俱樂部璀璨亮相,30家高校OpenHarmony開發者協會盛大啟幕。還分別致謝了年度星光TSG
    的頭像 發表于 10-21 14:10 ?212次閱讀

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標準系統編寫的UI應用類:HelloOpenHarmony。本案例是基于API9接口開發。本案例已在OpenHarmony凌蒙派-RK3568開發
    的頭像 發表于 09-15 08:09 ?371次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用開發:Hello<b class='flag-5'>Openharmony</b>

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

    : IPerson = { // 創建一個接口的實例 name: \"OpenHarmony\",// 設置屬性值 say: () => { // 實現接口方法
    發表于 09-14 12:47

    如何在Openharmony實現USB復合設備

    如何讓Openharmony設備HDC接口(OTG接口)作為一個復合設備,實現HDC(HDC:鴻蒙設備連接器) + CDC ACM(USB 虛擬串口),而設備本身支持HDC。所以需要增加CDC ACM(USB 虛擬串口)。
    的頭像 發表于 06-13 15:03 ?1608次閱讀
    如何在<b class='flag-5'>Openharmony</b>中<b class='flag-5'>實現</b>USB復合設備

    OpenHarmony實戰開發-如何實現窗口開發概述

    操作系統而言,窗口模塊提供了不同應用界面的組織管理邏輯。 窗口模塊的用途 在OpenHarmony中,窗口模塊主要負責以下職責: 提供應用和系統界面的窗口對象。 應用開發者通過窗口加載UI界面,實現界面
    發表于 05-06 14:29

    OpenHarmony南向開發實例:【游戲手柄】

    基于TS擴展的聲明式開發范式編程語言,以及OpenHarmony的分布式能力實現的一個手柄游戲。
    的頭像 發表于 04-17 10:21 ?749次閱讀
    <b class='flag-5'>OpenHarmony</b>南向開發實例:【游戲手柄】

    鴻蒙OpenHarmony開發實戰:【MiniCanvas】

    基于OpenHarmony的Cavas組件封裝了一版極簡操作的MiniCanvas,屏蔽了原有Canvas內部復雜的調用流程,支持一個API就可以實現相應的繪制能力,該庫還在繼續完善中,也歡迎PR。
    的頭像 發表于 03-23 20:43 ?351次閱讀

    OpenHarmony鴻蒙實戰】在RK3399開發板實現智能門禁人臉識別

    基于RK3399開發板,使用OpenHarmony3.0-LTS開發的應用。通過定時獲取攝像頭數據,實現人臉識別比對等功能。
    的頭像 發表于 03-20 17:38 ?1330次閱讀
    【<b class='flag-5'>OpenHarmony</b>鴻蒙實戰】在RK3399開發板<b class='flag-5'>實現</b>智能門禁人臉識別

    鴻蒙開發學習:【OpenHarmony HAR】

    OpenHarmony js/ts三方庫使用的是OpenHarmony靜態共享包,即HAR(Harmony Archive),可以包含js/ts代碼、c++庫、資源和配置文件。通過HAR,可以實現
    的頭像 發表于 03-18 16:27 ?744次閱讀

    【鴻蒙】OpenHarmony運行docker詳細步驟

    2.準備支持 Docker 容器的 OpenHarmony 內核 1.檢測 DAYU200 3568 OpenHarmony3.2release 內核對 docker 的支持 下載檢測
    的頭像 發表于 03-02 15:10 ?2607次閱讀
    【鴻蒙】<b class='flag-5'>OpenHarmony</b>運行docker詳細步驟

    OpenHarmony 項目實戰:基于全志 XR806 實現的上下位機雙 OpenHarmony 智能門鎖樣例

    一、簡介 本 demo 是基于 Openharmony 3.1 Beta 本版開發,不僅可以接收數字管家應用下發的指令來控制門鎖開啟,而且還可以通過數字管家設置不同的開鎖密碼以及一次性密碼,實現
    的頭像 發表于 02-19 17:25 ?1080次閱讀
    <b class='flag-5'>OpenHarmony</b> 項目實戰:基于全志 XR806 <b class='flag-5'>實現</b>的上下位機雙 <b class='flag-5'>OpenHarmony</b> 智能門鎖樣例

    淺談兼容 OpenHarmony 的 Flutter

    OpenHarmony SIG 組織在 Gitee 開源了兼容 OpenHarmony 的 Flutter。該組織主要用于孵化 OpenHarmony 相關的開源生態項目。 ? ? ▲ 倉庫地址
    的頭像 發表于 02-02 15:22 ?608次閱讀
    淺談兼容 <b class='flag-5'>OpenHarmony</b> 的 Flutter

    OpenHarmony 之 NAPI 框架介紹

    NAPI 是什么 NAPI 的概念源自 Nodejs,為了實現 javascript 腳本與 C++ 庫之間的相互調用,Nodejs 對 V8 引擎的 api 做了一層封裝,稱為 NAPI。可以在
    的頭像 發表于 02-01 17:34 ?692次閱讀
    <b class='flag-5'>OpenHarmony</b> 之 NAPI 框架介紹

    HKA5278 128音符旋律生成器一般說明

    電子發燒友網站提供《HKA5278 128音符旋律生成器一般說明.pdf》資料免費下載
    發表于 01-10 09:09 ?0次下載
    主站蜘蛛池模板: 99九九精品视频| 中文中幕无码亚洲视频| 欧美在线看费视频在线| 噜噜噜狠狠夜夜躁| 久久久精品3d动漫一区二区三区| 国产欧美一区二区精品久久久| 高清无码中文字幕在线观看视频 | XXX老姥群交| 亚洲精品视频在线观看视频| 私人玩物在线观看| 噜妇插内射精品| 美国xaxwaswaskino| 亚洲欧美国产旡码专区| 一区二区三区高清视频| 久久热最新网站获取3| 欧美巨大xxxx做受高清| 亚洲成熟人网站| 国产在线精品亚洲第1页| 久久热免费观看视频| 亚洲欧美日韩国产精品26u| 国内精品蜜汁乔依琳视频| 亚洲AV久久无码精品九九软件| 亚洲人成在线播放网站岛国| 国产99久久久国产精品成人| 999久久精品国产| 憋尿调教绝望之岛| 超碰97人人做人人爱网站| 成人性生交片无码免费看| 高h gl肉文| 成人免费观看国产高清| 国产99视频精品一区| 国产午夜视频在线| 国产剧情在线精品视频不卡| 国产区在线不卡视频观看| 狠日狠干日曰射| 果冻传媒在线播放| 久久er国产免费精品| 久久AV喷吹AV高潮欧美| 男男gaygay拳头| 免费观看国产视频| 日本久久久久亚洲中字幕|