语音识别之演奏小星星-理解音阶与频率

ops/2024/9/24 17:33:32/

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

语音识别之演奏小星星-理解音阶与频率

  • 演奏小星星-理解音阶与频率
    • 一、任务需求
    • 二、任务目标
          • 1、掌握音名与频率
          • 2、掌握国际标准音和八度
          • 3、学习使用librosa计算不同音高对应的频率
    • 三、任务环境
          • 1、jupyter开发环境
          • 2、python3.6
          • 3、tensorflow2.4
    • 四、任务实施过程
      • 1、音名与频率
      • 2、八度
      • 3、生成音阶
      • 4、演奏小星星
    • 五、任务小结
  • 说明

演奏小星星-理解音阶与频率


一、任务需求

国际标准音是为了方便了音乐理论研究、乐器制作和文化交流而在国际上统一的音高标准。

音名标记C、D、E、F、G、A、B

乐音体系中的各音级,其高度都有一定的标准。音的标准高度,1939年在伦敦的国际会议上决定国际通用的标准(第一国际标准)是440Hz,波长78cm的a音,即以小字一组的a为“标准音”。

国际上有了统一的音高标准,它方便了音乐理论研究、乐器制作和文化交流。机械波约261.6Hz,波长1.3m的c音在乐音体系中叫中央c,它位于基本音级首位。

要求:利用librosa学习音节与频率相关概念及实现

二、任务目标

1、掌握音名与频率
2、掌握国际标准音和八度
3、学习使用librosa计算不同音高对应的频率

三、任务环境

1、jupyter开发环境
2、python3.6
3、tensorflow2.4

四、任务实施过程

1、音名与频率

以国际标准音 A-la-440HZ为准:

字母体系唱各体系频率
Cdo261.6HZ
Dre293.6HZ
Emi329.6HZ
Ffa349.2HZ
Gsol392HZ
Ala440HZ
Bsi493.8HZ

八度音的频率关系: 每相邻的两个半音,高音频率是低音频率的“2的1/12次方倍”。 例如国际标准音A的频率是440HZ(因此也被成文A440),那么比它高半音的bB。频率就是: 440 × 2 1 / 12 = 466.13 H Z 440\times2^{1/12}=466.13HZ 440×21/12=466.13HZ。所以,以此类推,一个八度的12个音,连乘下来结果正好得2。通俗一点儿说,高音1的频率是比它低一个八度的那个1的频率的两倍。

为了验证上述表格的频率结论,我们做个实验如下:

# 指定基准频率
base_sound_hz = 440
# 生成音名
pitch_names = ['C','D','E','F','G','A','B']
# 生成音高顺序
pitch_loc = dict(zip(pitch_names,range(len(pitch_names))))
pitch_loc

{‘C’: 0, ‘D’: 1, ‘E’: 2, ‘F’: 3, ‘G’: 4, ‘A’: 5, ‘B’: 6}

2、八度

根据标准音理论,一个全音与全音之间相差 2 2 / 12 2^{2/12} 22/12,一个八度与八度之间正好相差 2 12 / 12 = 2 2^{12/12}=2 212/12=2倍,即一个八度的do,相比下一个八度的do,在频率上刚好相差两倍

因此音名A为标准音,频率440,下一个全音B的频率应当为:

B = 440*2**(2/12);B

493.8833012561241

根据这个理论,我们可以确定各个音名对应的频率,需要注意的是,音名E和F之间只相差半音,即 2 1 / 12 2^{1/12} 21/12倍,一个八度之内的其他音高之间则是相差一个全音,即 2 2 / 12 2^{2/12} 22/12。自定义函数如下:

def get_pitch_hz(pitch_name):pitch_name = pitch_name.upper()if pitch_loc.get(pitch_name) is not None:if pitch_loc.get(pitch_name)>2:coef_exp = (pitch_loc.get(pitch_name)*2-10)/12else:coef_exp = (pitch_loc.get(pitch_name)*2-9)/12return 440*2**coef_expelse:raise ValueError('没有查询到这个音名!')get_pitch_hz('c')

261.6255653005986

3、生成音阶

有了这个函数,我们就可以尝试生成音乐了。首先生成一个简单的C调do

notation = '1'
pitch_name = pitch_names[int(notation[0])-1]
pitch_name

‘C’

# 使用自定义函数,将音名转换为频率
pitch_hz = get_pitch_hz(pitch_name)
pitch_hz

261.6255653005986

import librosa
# 生成纯音信号do
pitch_sound =  librosa.tone(pitch_hz, duration=0.5)
import IPython.display as ipd
ipd.Audio(pitch_sound,rate=22050)

4、演奏小星星

接下来把生成声音的步骤,封装在一个自定义函数

def get_notation_sound(notation):pitch_name = pitch_names[int(notation[0])-1]pitch_hz = get_pitch_hz(pitch_name)pitch_sound =  librosa.tone(pitch_hz, duration=0.5)return pitch_sound
ipd.Audio(get_notation_sound('2'),rate=22050)

有了这个函数,我们就可以尝试根据乐谱生成音乐了。例如,我们可以根据下面的小星星乐谱生成音乐。

# 定义小行星简谱
notations = '115566554433221155443322554433221155665544332211'

这里需要注意的是,简谱中的增时线,我们简单的使用增时线前一个音符做为替换。

import numpy as np
# 根据简谱生成音乐
def get_music(notations,rate=22050):tmp_sound = np.array([])for notation in notations:notation_sound = get_notation_sound(notation)notation_sound = np.pad(notation_sound,1000)tmp_sound = np.append(tmp_sound,notation_sound)return tmp_sound
ipd.Audio(get_music(notations),rate=22050)

再尝试一下2倍速播放(本质就是对采样率的调整,单位时间内采样率翻倍,就相当于加速1倍)

ipd.Audio(get_music(notations),rate=44100)

五、任务小结

本实验我们学习了音名、频率、国际标准音和八度等相关概念。

学习使用librosa生成音高对应频率的音频

根据本实验能发现这样一个现象:人类对频率的认知,并不是线性的,而是指数变化的。这就是为什么很多情况下,我们需要对声音频率做对数变换,其中一个目的,就是为了符合人类的听觉认知。

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我


http://www.ppmy.cn/ops/35931.html

相关文章

2024年北京高校数学建模校际联赛竞赛赛题浅析

一图流: 题目复杂性技术需求数据处理主要难点A题:格陵兰入海冰川3气象学、物理学、环境科学时间序列分析、空间数据处理多学科集成、预测模型的准确性和策略制定B题:铁道线路动态检测数据分析1数据科学、机器学习、信号处理实时数据流处理、异…

西门子数控网络IP设定配置

总结:menuselect-诊断-屏幕下方右翻页找到tcp/ip,进去选择tcp/ip诊断,进去选择x130网口,点击更改, 如果没有更改,menuselect-调试-口令,输入口令 sunrise 然后重新配置tcp/ip,配置完…

数据结构===图

文章目录 概要图的组成无向图有向图带权图 存储邻接矩阵邻接表 图的代码小结 概要 图是一种复杂的数据结构 图包括顶点,边。图的分类有无向图,有向图,带权图。 按照存储有邻接矩阵,邻接表。 图的组成 图有顶点和边组成。 图有…

Node.js里面 Path 模块的介绍和使用

Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方式引入该模块: var path require("path") 方法描述 序号方法 & 描述1path.normalize(p) 规范化路径,注意.. 和 .。2path.join([path1][, path2][,…

数据库数据恢复—SQL Server数据库ndf文件变为0KB的数据恢复案例

SQL Server数据库故障: 存储设备损坏导致存储中SQL Server数据库崩溃。对数据库文件进行恢复后,用户发现有4个ndf文件的大小变为0KB。该SQL Server数据库每10天生成一个大小相同的NDF文件,该SQL Server数据库包含两个LDF文件。 SQL Server数据…

vector的oj题

1.只出现1次的数字 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 方法:…

每日OJ题_DFS解决FloodFill⑦_力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围)

目录 力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围) 解析代码 力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围) LCR 130. 衣橱整理 难度 中等 家居整理师将待整理衣橱划分为 m x n 的二维矩阵 grid&#xff…

万里牛ERP集成金蝶K3(万里牛主管供应链)

源系统成集云目标系统 金蝶K3介绍 金蝶K3是一款ERP软件,它集成了供应链管理、财务管理、人力资源管理、客户关系管理、办公自动化、商业分析、移动商务、集成接口及行业插件等业务管理组件。以成本管理为目标,计划与流程控制为主线&#xff0…