网站建设采购项目,wordpress演示站,桂林百度网站建设,学设计常用的网站一、音符检测的基本原理
本文基于 OpenHarmony 开源系统提供了一种音符检测的原理方法#xff0c;结合多首音乐#xff0c;运用了 python 和 C 两种编程环境实现了预期的检出效果。旨在为振动马达(vibrator)提供音乐节奏感的触觉效果#xff0c;代码所在目录 .\base\sensor…一、音符检测的基本原理
本文基于 OpenHarmony 开源系统提供了一种音符检测的原理方法结合多首音乐运用了 python 和 C 两种编程环境实现了预期的检出效果。旨在为振动马达(vibrator)提供音乐节奏感的触觉效果代码所在目录 .\base\sensors\sensor\vibration_convert。
先从 python 实现说起Librosa 关于音符检测主要用到了两个函数一个是 onset_strength(),负责生成包含音符产生的频率突变的包络线如蓝色线条所示。另一个是 onset_detect()主要运用峰点检测找到每个音符的位置如黄色线条所示。 图 1 音符检测包络图 包含有用的频率突变的包络线是音符检测的核心所在。傅里叶变换能够得到全部信号采样的频谱图即每个频率的能量贡献如图 2 所示。但是每个时刻频谱图却得不到于是将全部采样分割成若干固定长度的窗口每个窗口应用傅里叶变化从而得到这一窗口的频率分布水平轴为时间纵轴为频率颜色代表能量大小如图 3 所示。 图 2 整体频率分布图 图 3 时频图
每种乐器在音符产生时前后时间片段的频率将会发生明显变化如图 4 所示。于是将时频图相邻列做差分将明显看到变化的频率。为了便于分析只取正值具有相同的效果所以负值填零。一个时刻变化的频率有多个如何取舍有三种方法平均数、中位数和联合目前常用到的是中位数和平均数。至此将得到任意时刻发生明显频率变化的单一能量如图 1 蓝色线条所示。 图 4 时频图相邻列差分前后变化
二、音符检测的准确性
目前采用频谱光通量相邻列差分方法检测是业界公认且较为准确的方法音符检出率仅为 70% 多。不准确的原因可能有乐器多且差异较大信号衰减对性能的影响颤音影响峰点检测时不同参数的影响这些主要是针对音乐的研究。
三、音符检测的程序流程
3.1 程序实现
音符检测功能核心就是频谱图和梅尔滤波器频谱图的核心就是短时傅里叶变换C 代码片段如下,
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];}}// EOFif(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 precisionif(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 weightsn_mels int(n_mels)weights np.zeros((n_mels, int(1 n_fft // 2)), dtypedtype)# Center freqs of each FFT binfftfreqs fft_frequencies(srsr, n_fftn_fft)# Center freqs of mel bands - uniformly spaced between limitsmel_f mel_frequencies(n_mels 2, fminfmin, fmaxfmax, htkhtk)fdiff np.diff(mel_f)ramps np.subtract.outer(mel_f, fftfreqs)for i in range(n_mels):# lower and upper slopes for all binslower -ramps[i] / fdiff[i]upper ramps[i 2] / fdiff[i 1]# .. then intersect them with each other and zeroweights[i] np.maximum(0, np.minimum(lower, upper))if norm slaney:# Slaney-style mel is scaled to be approx constant energy per channelenorm 2.0 / (mel_f[2 : n_mels 2] - mel_f[:n_mels])weights * enorm[:, np.newaxis]else:weights util.normalize(weights, normnorm, axis-1)# Only check weights if f_mel[0] is positiveif not np.all((mel_f[:-2] 0) | (weights.max(axis1) 0)):# This means we have an empty channel somewherewarnings.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.,stacklevel2,)
return weights3.2 功能流程图 为了能让大家更好的学习鸿蒙HarmonyOS NEXT开发技术这边特意整理了《鸿蒙开发学习手册》共计890页希望对大家有所帮助https://qr21.cn/FV7h05
《鸿蒙开发学习手册》
如何快速入门https://qr21.cn/FV7h05
基本概念构建第一个ArkTS应用…… 开发基础知识https://qr21.cn/FV7h05
应用基础知识配置文件应用数据管理应用安全管理应用隐私保护三方应用调用管控机制资源分类与访问学习ArkTS语言…… 基于ArkTS 开发https://qr21.cn/FV7h05
Ability开发UI开发公共事件与通知窗口管理媒体安全网络与链接电话服务数据管理后台任务(Background Task)管理设备管理设备使用信息统计DFX国际化开发折叠屏系列…… 鸿蒙开发面试真题含参考答案https://qr18.cn/F781PH 鸿蒙开发面试大盘集篇共计319页https://qr18.cn/F781PH
1.项目开发必备面试题 2.性能优化方向 3.架构方向 4.鸿蒙开发系统底层方向 5.鸿蒙音视频开发方向 6.鸿蒙车载开发方向 7.鸿蒙南向开发方向