特色

交换友链~~~

RT >_<

博主大学生、计算机领域、原OIer,自认为计算机水平还是不错哒,希望和各类朋友多多交流,也希望与各位感兴趣的博主多多交流,当然,重点是想要交换一波友情链接,同类网站、个人网站优先。

另外,笔者想好好维护这个博客,并作为个人性质,所以谢绝任何有商业推广性质的网站交换友链哦~

联系QQ:519954392

邮箱:maohanyang789@163.com

conda安装指定版本号以及build方式

有些时候我们使用conda,希望安装特定版本的工具

比如这里安装GPU版本的tensorflow,我们希望指定cuda版本为7.5,发现这是无法通过指定version实现,命令也很简单,如下:

 

python音频处理库librosa教程(2) hop_length的选取

教程中很坑的一点,是让我们自定义hop_length,然后……what is hop_length?

现在,我们需要重新思考一下特征的频率,对于一个22050HZ的采样数据,显然,最后提取出来的特征序列长度小于等于22050HZ,当最后特征等于22050Hz时,提取出来的特征当然就是自身,当特征频率更小,比如2205Hz,那么我们就可以将连续的10个数据进行做平均值、方差等等操作,使得特征长度缩小至1/10。

这种分窗口压缩数据的方式确实很容易想到,但是在这种情况下缺没有平常那么有用。因为音频采样数据本身就是在一个波形上的一些随机点,这些随机点进行平均值操作没有任何意义!

怎么办呢,其实结果很简单,既然我们希望对于一个窗口提取音频信号,那么我们直接对于这个窗口进行一次傅里叶变换就好了。因此这也就是librosa所做的,对于大部分样本提取函数,你都需要传入一个hop_length,作为傅里叶变换的长度,显然,而这个值一般选择2的整数次幂(为了可以通过快速傅里叶算法优化性能)。

对于不想想太多的我们,完全可以直接使用每个函数的默认hop_length进行编写

python音频处理库librosa教程(1) 一个简单的音频特征提取程序

本文的目标是在python中实现对于音频特征提取,提取出的特征应该是一个时序的特征向量。

librosa一个专用于处理音频的库,其官方教程可以在 Librosa官方教程 中找到,这篇教程也是基于官方教程写出来的。

首先,笔者学习一个库一般都是直接看一篇样例程序,这里直接将官网的样例程序复制到这里。

可能官方也知道我们用这个库基本就是用来特征提取的,所以索性就将特征提取的代码放到了教程里面。

声音信号本身是一个连续的函数,在计算机中,分析连续的函数的方式并不多,采样(sample) 就是其中一个很有用的分析方法。具体来说,采样就是将连续函数按照给定的间隔区间设置采样点,如librosa默认每秒钟采样22050个采样点。对于每一个采样点,获得该信号函数在这个点处的大小。显然,当采样点足够密集,那么我们得到的序列就能够足够逼近原函数。

librosa.load 函数的具体实现细节如下

将连续的音频信号按照给定的采样率(sample rate) 进行采样,并且可以设置开始时间(offset) 以及持续时间(duration),将结果储存到y数组中,用于后续的分析。

从另一个方面来看,如果我们通过load函数仅仅得到了y数组,则我们丢失了速度信息,之后我们甚至无法分辨一个“慢”的曲子和一个“快”的曲子,这就是为什么load函数不仅返回y,同时也返回sr的原因。

接下来,y作为一个合成波形,可以分成两个分量,即谐波(harmonic)与冲击波(percussive)。由于笔者也不太清楚他们具体该怎么翻译,所以按照自己的理解自由发挥咯。

从粒度上来看,谐波相对为细粒度特征,而冲击波为粗粒度特征。诸如敲鼓类似的声音拥有可辨别的强弱变化,归为冲击波。而吹笛子这种人耳本身无法辨别的特征,是谐波。接下来,我们将分别对于冲击波以及谐波进行特征的提取。

 

beat_frames指的就是每一排所对应的分界点。

这一句话真的是一个非常有误解性质的语句,这里先把结果摆出来:hop_length决定了最后输出特征序列长度,hop_length越大,最后输出的序列越小,但是两者之间并不是一个线性关系。也不能够将hop_length理解为扫描窗口大小!

对于hop_length的详细讲述可以在 python音频处理库librosa教程(2) hop_length的选取 里面看到。

接下来,我们可以计算梅尔频率倒谱系数(MFCC),简单来说,MFCC可以用以表达曲目的音高信息。

MFCC本身只反映了音频的静态特性,所以我们需要对她进行差分,以得到动态特性。其中,差分又可以分别选择一阶差分和二阶差分。

既然我们已经分别得到了mfcc以及mfcc_delta,那么我们可以将它们合称为一个特征,这里就用了np.vstack函数。接着,librosa.util.sync函数用于以窗口形式合并多个连续的变量,比如这里,就以beat_frames为分界点,对每一个分界点中的序列用其平均值表示。到了这一步,我们得到的是,长度为音乐拍数,宽度为特征数的向量。

下面是对于谐波进行分析

由于这里出来的是一个类似于色度图的东西,所以笔者非常怀疑其在后续训练模型的意义是否足够。之后,用同房的方法,将色度图按照beat_frames进行简化。

 

附录

节拍提取:Beat Tracking by Dynamic Programming

果壳中的宇宙

即便把我关在果壳之中,

仍然自以为无限空间之王

——莎士比亚《哈姆雷特》第二幕第二场

上一次看这本书,大概已经是两年前了,现在看来,两年前的我,恐怕就是浏览了书中插图而已,并没有真正看这本书本身。而单纯的插图,只是一些离散的连环画一般,并无法构成一种中心思想。

书中前一章介绍相对论简史,正是之前物理课的所学知识,所以基本上都是一扫而过。接着的两章,介绍时间,以及果壳中的宇宙这个概念。新颖,但是还是能够努力看懂。这两章也是我最有感触的章节了。后面三章,看起来是为了迎合大众读者的口味,大谈未来,过去,以及星际航行,虽说是迎合大众口味,但是里面的理论还真有些深奥。最后一章介绍膜理论,唔,感性理解吧。。。

一年前的我,还以为时间是一条笔直的线,没有开端,也没有结束。一个月前,我了解到了,原来时间,并不是那么的独立,他和空间通过某种方式纠缠在了一起。不过大体上来,时间开始有一个固定的方向,每一个参考系内,时间仍是从无穷远流向无穷远。而没有想到,倘若我们将时间这个直线,稍微加以变换,正如复变中的共形映射,无穷远的东西瞬间被缩至果壳之中。甚至,在果壳之中的人们,在对宇宙本身而言的围观尺度中,仍然自以为自己为无限空间之王。

想到这种形象的比喻,竟然处置莎士比亚的笔下,就觉得冥冥之中有天意左右呢。科学真的就是这么独立的东西么。如果科学真的能够用自己的体系解决问题,那么为什么科学的发现一次一次撞向哲学的规律呢?

站在科学指数级发展的今天,不禁期待也许有生之年,这种问题就可以得到答案呢!

 

读书计划完成度(1/25)

往事:大学物理,一门感触深刻的课程

之前常问,计算机这个专业根本和大学物理不沾边,学校怎么会将大学物理设为必修课呢?现在看来,最期末结课时间,最令我感触深刻的,竟然就是这个曾经最看不起的课程了。

老毕,毕楷杰,选课的时候还真以为是中国人呢,通过幽默,细腻的教学方式,深深感动了一个班的学生。

每次专门回答Zero等奇怪问题的Zero Position,专门抽最后一排回答问题的有趣规则,每逢节日的奇装异服,还有家庭表演,这就是用心吧。

课程中的点点滴滴越发模糊,但是每节课,总会有那么一些无法忘记的经典。诸如“企鹅与中国人”这个我现在都不知道要表达什么意思的梗,短波杀手“鸽子pupu”,物理学之精粹“Parsimony”,不知道已经说错多少年的“广义双节棍”。

课程人数从上学期的7-8排,缩减了2/3左右,但是这个的原因,大概仅仅是现在GPA至上的产物吧。否则完全无法理解为什么这样一个老师会导致学生的净流出?不过我并不在意,即使这次考试没有能够及格,我也绝不会后悔。而且最后留下的都是真爱了吧。

在薛定谔那只奇奇怪怪的猫的注视下,课程走到了尾声,故写下文章用于记忆~

SharedApplication: Linux Shared Memory Wrapper in C++, Lockfree Queue

Introduction

SharedApplication is a class used for sharing data between processes, support malloc between multi-process and could be derived to create multi-process data structure.

SharedQueue is a lockfree queue with fixed capacity, derived from the SharedApplication. Easy to use.

Code

Github:https://github.com/mhy12345/SharedApplication

Usage

SharedApplication

Create a SharedApplication instance with a unique APPKEY. The APPKEY is used to tell the operating system which Shared Memory you are going to alloc.

Then, we can do some basic configuration to our application.

Set the size of the memory you are going to alloc, and this must called before start. If it wasn’t called, then the default size will be 1024 bytes.

Some other configurations are also available.

After the configurations, you can start the sApp, simple write:

Then, in you program, you can use malloc to alloc memory.

In other process, if you use the same APPKEY, and use same order of malloc, and same size, then the contents in the memory allocated should be synchronized.

Shared Queue

The SharedQueue is a private inherited form the SharedApplication, means you can just replace SharedApplication with SharedQueue.

In the main function, you can use  sQueue like a normal queue.

Attentions

  • In the SharedApplication, make sure you alloc each memory block using the same order and size
  • The destructive function must be called, otherwise the shared memory cannot be deleted.

SharedApplication: 共享内存操作原理

共享内存是Linux里面一个进程通讯的实现机制,通过系统API将同一块内存块挂载在到两个进程的内存地址空间中,从而实现共享内存的操作。

对于一块共享内存,我们用Key和Id进行标识,Key为用户自定义的一个值,不同进程倘若使用了同一个Key,即视为他们需要同一块共享内存。通过Key,用户可以向系统申请开一个指定大小的共享内存,并返回这块内存的内部标识Id,之后的挂载操作都需要用Id进行制定。

有关共享内存的API都封装在了<sys/shm.h>文件中,具体有

通过自定义Token新建共享内存,并返回标识符: appId = shmget(TOKEN,size,0666)

通过标识符挂在已经建好的共享内存到本地内存空间: ptr = shmat(appId,NULL,0)

取消挂载: shmdt(ptr)

删除共享内存: shmctl(appId,IPC_RMID,NULL)

每一次需要共享内存,强行调用这些语句看起来比较的繁琐,因此我希望写一个共享内存的操控框架,使得每次只需要极少的代码,就可自动完成诸如共享内存挂载,新建等要求。这也是SharedApplication的编写背景。

 

VHDL学习笔记

VHDL学习笔记

  • entity/architecture:
    • entity:实体,描述所设计的系统的外部接口信号,定义电路设计中所有的输入和输出端口
    • architecture:结构体 ,描述系统内部的结构和行为,理解为实体的派生类,实体只是给定了输入输出的信号类型,而具体输入输出的如何关联,是由architecture决定
    • generic:类属,对于实体外加一些属性定义???
  • 端口方向
    • in
    • out
    • inout
    • buffer
  • process:进程,进程间并行,进程内部串行计算,进程的参数表示进程对于哪一个信号的变化敏感

相关资源

VHDL英文版文档:https://www.nandland.com/vhdl/tutorials/index.html