基於Android樂音識別(2)

目錄java

  1. 傅里葉變換git

  2. matlab代碼實現&&仿真github

  3. 基頻提取比對spa

傅里葉變換

距離上一次更新博客,已經很久了,相信看了我上一篇文章的,如今對個人這篇文章可能比較期待了,這個更新晚的緣由一個是因爲最近課程比較緊,因此對於樂音識別的研究擱置了一段時間,再就是其中也出現了一些問題,致使咱們改變了一下本身的策略。code

進入正題,學太高數的同窗,對傅里葉變化這個概念應該都不會陌生,可是具體是作什麼的呢?知乎上以前看到一篇文章,關於傅里葉變換的,講的很是詳細,附帶個地址。傅里葉分析之掐死教程(完整版)對於咱們以前的信號,咱們的分析都是在時域上的,對於在時域上的信號
只是根據咱們的量化程度,對於幅度所採起的一個表示方式,可是對於咱們肯定它具體是哪個音階是沒法實現的,因此須要咱們對其進行傅里葉變化,將其從時域信號圖轉化到咱們的頻域上來,而後根據相關的頻域參數來肯定咱們其具體是屬於哪個音階。在作傅里葉變化的時候遇到了一個小坑,致使在這上面糾結了好久,一個是由於對於matlab不是很熟悉,再就是自己如今在作的事情就是點歪的一個技能點。經過對聲音進行傅里葉變化,咱們也能夠作一些頗有趣的事情,好比根據電話按鍵的聲音對於相應的按鍵的監聽,由於在電話出現時,沒有數字信號這回事,因此也就不存在一些數字處理器,因此對於電話的按鍵,是對於電話按鍵的聲音的模擬信號進行監聽來肯定的,每個按鍵都是由兩個不一樣的頻率進行疊加來獲得的,因此咱們能夠對電話的按鍵音,進行一個切割,將有聲段拿出來以後,作一個傅里葉變化獲得其中的兩個頻率,而後和相依的頻率表進行一個比對,這也是以前新聞上說的某少年獲取周鴻禕手機號的方法。blog

Matlab的實現和仿真

[y, Fs] = audioread('/Users/chenjensen/Desktop/record.mp3');
plot(abs(fft(y)))

經過audioread來讀取咱們的音頻文件,這裏的y是關於音頻的數字信號序列,Fs是咱們的採樣頻率,經過利用fft獲得以下圖
圖片描述
咱們以前講過經過傅里葉變化,咱們能夠獲得這個聲音的頻率,彷佛咱們的事情已經結束了,獲得一個接近1600的值,這也是以前犯得一個錯誤,這裏提供的聲音是咱們中音D,其頻率523.25,可是這裏獲得確實這麼大,公式也是沒有錯的,開始這讓我懷疑我纔去這種提取基頻的方式不對,最終被同窗發現了錯誤,就是x軸單位的問題,咱們經過fft變化,x軸的最大範圍是咱們的採樣頻率,而其每一個單位確並非1,而是咱們的採樣頻率/採樣點數,按照這種思路再來作一個計算教程

z=44100/length(y)

z = 0.3300圖片

經過對原圖形進行放大,最後發現該值接近於1590
計算咱們的這兩個值的乘積:1590*0.3300=524.7000
和咱們的原始數據523.25很是接近了,咱們經過這個大概能夠估計出咱們的音階了。
固然這裏還存在的一個疑問是咱們獲得的一個口琴的音,不可能只是單純的存在一個頻率的,一個聲音確定是由多個音疊加而成的,只是在該音階,該種頻率表達的更爲充分,而後咱們能夠利用這個頻率來表示這個音階,咱們要取的頻率是其在y軸上的值最大的。同時對於傅里葉的變化咱們獲得圖形是對稱的,咱們只須要取其前面一部分。get

基頻提取和比對

經過對於基頻的提取和比對,咱們能夠獲得咱們的當前的音階。博客

該文只是單純針對傅里葉變化展開,鏈接上篇文章,咱們提取出來有聲段以後,就能夠對這些有聲段進行一個傅里葉變化來獲取其頻率值,而不是像對其所有進行傅里葉變化。

具體的實現細節,將會在後續文章更新,歡迎各位一塊兒交流提高。

下篇更新Android中java代碼的具體實現,項目也會在github開源。

相關文章
相關標籤/搜索