生醫工程實驗期末專題 -...
Transcript of 生醫工程實驗期末專題 -...
1
⽣醫⼯程實驗期末專題
第四組
B06901038 王⼈出 B06901083 熊政凱 B06901180 鄭謹譯
ㄧ、簡介與動機
漫步於藝⽂中⼼附近常可以發現許多街頭藝⼈,然⽽他們卻需要攜帶
許多樂器才能演奏,倘若遇到⼤型樂器如爵⼠⿎、電⼦琴即會遇到攜帶不
便的問題。另外,試想每個表演者演奏同⼀⾸樂曲,⾵格整體上差異不
⼤,要如何產⽣更具個⼈特⾊的⾳樂呢?同時,經由上課介紹也可發現⽣
醫⼯程這個領域對社會⼤眾仍然⼗分陌⽣。於是我們決定將腦波
(EEG)、⼼電訊號(ECG)、肌⾁訊號(EMG)等較為艱澀的⽣理訊號
導⼊平易近⼈的⾳樂,並產⽣與眾不同的⾳樂系統。
⼆、實驗架構與設計
(ㄧ)整體架構
主要架構圖如下
四個輸⼊為⼿指訊號、腿部肌⾁、⼼跳頻率、腦波訊號。
其中左⼿操控觸控模組,彈奏對應和弦;右⼿指同時使⽤彎曲
模組決定彈奏聲量與彈奏模擬鍵盤決定⾳⾼(似鋼琴);左腿肌⾁
⼼跳頻率
⼿指訊號
腦波訊號
腿部肌⾁
EMG 電路
彎曲模組
模擬鍵盤
觸控模組
2
訊號控制⿎組;右腿訊號控制踏板(制⾳踏板,踩下即停⽌延⾳效
果)。以上四種機構透過 Arduino 分析處理後透過 Serial 傳⼊
python。
腦波訊號經程式處理後輸⼊ python 作為⾳⾊,⼼跳頻率透過
Z2 Health Watch 分析後輸⼊ python。最後 python 彙整所有訊號後
輸出⾄喇叭即可聽到彈奏聲⾳。
(⼆)使⽤器材
硬體部份
Arduino Uno 觸控模組 彎曲模組 按鍵 Z2 Watch
個數 3 1 5 21 1
圖⽚
另使⽤凝膠貼⽚*2、電阻電容 IC ua741 數個、IC INA128*2、洞洞板等
軟體部分使⽤ pygame.mixer、pySerial、scipy.io.wavfile、numpy.fft。
(三)硬體設計
1. 彎曲模組
彎曲模組 Arduino 5V Arduino GND
Arduino A1-5
將上圖電路之彎曲模組固定在⼿套上如右
圖所⽰,分別在模組兩端焊上兩條⾧線延
伸⾄ Arduino 板,共拉出 10 條線。將五
個電阻電路固定於麵包上即可完成右⼿彎
曲模組電路設計
3
彎曲模組會隨彎曲程度不同⽽改變⾃⾝電阻⼤⼩,通常為 25kΩ
左右,串連⼀ 27 kΩ 電阻並測量彎曲模組分壓。
2. 模擬鍵盤
將按鈕電路與 LED 焊接上洞洞板,每個琴鍵的電路如下
將電路重複焊接 21 組後即可得三個 8 度⾳之⽩鍵(為簡化省略⿊鍵,
彌補⽅式於程式部分說明)。另設計鍵盤機構側視圖如下⽰意圖:
3. EMG 濾波電路
按鈕 Arduino 5V Arduino GND
Arduino 2-13
LED
當於箭頭位置按下琴鍵
後,會讓琴鍵壓下按鈕形
成通路,使上電路圖 LED
發亮,數位腳位=1。
EMG Signal Differential Amp
Voltage Shifter
60 Hz Notch DC Reject
60 Hz Notch
Voltage Buffer
Amplifier
500Hz LP 40Hz HP
500Hz LP 40Hz HP
EMG Output Voltage Buffer
4
EMG 信號頻域上分佈⼤約在 100~200Hz 間,交流電電源⼤約 60Hz。
電路實作上,為了得到 EMG 訊號,需經過放⼤並加以濾波,濾除 60Hz
電源供電,⾼頻雜訊以及電⼦元件造成的 DC offset,以下是電路架構。
(1) Differential Amplifier
第⼀級元件對雜訊的引響⾄關重要,因此第⼀級放⼤器,我們使⽤低雜訊
的差動放⼤器將訊號放⼤,使⽤ INA128 來完成。以下為詳細元件內容。
選取 𝑅! = 510𝛺 ± 5%
𝐺 = 1 + "#$"%#
≅ 101
𝑉& = 12𝑉𝑉' = −12𝑉
(2) 60Hz Notch 1
濾交流波,採⽤ Active Twin - T - Notch Filter & 2*UA741
Center Frequency : 60 Hz Feedback : 80
R1 270kΩ
R2 270kΩ
R3 270/2k = 135kΩ
R4 80kΩ
R5 80kΩ
C1 10nF
C2 10nF C3 22.3nF
5
(3) Amplifier 1
信號經過放⼤
(4) DC Reject Highpass Filter
濾掉 DC offset,使進⼊下級放⼤器不因 offset 過⼤造成放⼤扭曲
UA741
R1 54kΩ
R2 600kΩ
𝐺 = 1 +600𝑘54𝑘
= 12.1
C 100nF
R 1.5MΩ
fcutoff 1.06Hz
6
(5) 60Hz Notch 2
濾交流波,採⽤ Active Twin - T - Notch Filter & 2*UA741
Center Frequency : 60 Hz Feedback : 80
(6) Voltage Buffer
讓電壓穩定
R1 270kΩ
R2 270kΩ
R3 270/2k = 135kΩ
R4 80kΩ
R5 80kΩ
C1 10nF
C2 10nF C3 22.3nF
UA741
2: input
3: output
6: output
7
(7) 500 Hz Lowpass Filter 1
⽤以過濾不要的⾼頻雜訊,與接下來的 HP 組成⼀個帶通濾波
(8) 40 Hz Highpass Filter 1
⽤以過濾不要的低頻雜訊,與上⼀級的 LP 組成⼀個帶通濾波
R1 22kΩ
R2 22kΩ
C1 10nF
C2 22.3nF
R1 560kΩ
R2 280kΩ
C1 10nF
C2 10nF
8
(9) 500 Hz Lowpass Filter 2
過濾不要的⾼頻雜訊,為了將雜訊除乾淨,再做⼀次,同樣與下⼀級 HP
組成帶通濾波器
(10) 40 Hz Highpass Filter 2
濾除低頻雜訊,與上⼀級的 LP 組成⼀個帶通濾波
R1 22kΩ
R2 22kΩ
C1 10nF
C2 22.3nF
R1 560kΩ
R2 280kΩ
C1 10nF
C2 10nF
9
(11) Voltage Shifter
放⼤電壓並使輸出電壓維持在 1-4 V 供 Arduino 讀值
𝑉& =%((2 + 𝑉)*+) 𝑉,-. = 61 + /.%1
/.%17𝑉& = 2𝑉& = 2 + 𝑉)*+
(12) Voltage Buffer
UA741
R1 9.1MΩ
R2 9.1MΩ
R3 9.1MΩ R4 9.1MΩ
UA741
2: input
3: output
6: output
10
讓電壓穩定,輸出給 Arduino
(13) Whole Circuit
將上述電路重複ㄧ組即可完成左腳與右腳濾波。
(四)軟體設計
1. Arduino 總共使⽤三塊板⼦,逐⼀說明
(1) Final1,包含彎曲模組與觸控模組
Input:A1-A5 彎曲模組
Input:7 觸控板 scl、2 觸控板 sdo
使⽤網路上觸控模組程式改寫成為
class CTtP229TouchButton,⾒後圖
取得⼀開始的彎曲模組變化量
5 彎曲模組參數
觸控模組 16 鍵數值
11
class CTtP229TouchButton:
(2) Final2,包含 12 個⾳與左右腳 EMG
Input 2-13 分別代表低⾳ C 到中⾳ G
Input A1-A4 分別代表左右腳 EMG 訊號
先取得迴圈開始時的彎曲模組參數
取得 16 鍵觸控情況
爲減少感應錯誤,將 16 鍵分為 4 個象
限,同象限內任意⼀鍵有值則判斷為
該象限代表和弦被彈奏。
最後透過 Serial.print 傳送資料到 python,即完成左⼿和弦判斷
修改⾃
https://tinyurl.com/umbmj33
12
每經過 25ms 計算⼀次
彎曲模組數值差距,將
差距值回傳⾄ python,
播放出聲⾳強弱,即完
成右⼿彎曲模組判斷。
透過 Serial.print 傳輸,琴鍵部
分由 0à1 則傳送 p i,i 為編
號,反之 1à0 傳送 r i
13
(3) Final3,包含 9 個⾳
Input 2-10 分別代表中⾳ A 到⾼⾳ B
程式碼與 Final2 琴鍵部分的程式碼運作原理⼀樣,故省略
透過以上三組 Arduino 即可操控所有彎曲、觸控模組與琴鍵。
2. 主機端軟體架構
(1)主架構
Arduino Serial 中利⽤ pyserial 建⽴與 Arduino 端 COM
port 的連結,接收 Arduino 的訊號並將訊號交給 Event
Control 區塊。
Event Control 區塊分析收到的訊號並做出對應相關動
作,將設定好的聲⾳資訊(指定聲⾳序號、撥放時間、⾳量
等)放⼊ Pay List 中。
Play List 區塊判定聲⾳的撥放時間是否到了,拿聲⾳資
訊查詢 Sound List 得到對應的⾳源,將要撥放的聲⾳撥出。
Sound Library 是指定的聲⾳⾳源庫,在這裡放的是處理
好的腦波⽣成聲⾳,在初始化時利⽤ pygame.mixer 讀⼊,儲
存進 Sound List 預備被撥放。
Sound List 利⽤存放著聲⾳源清單,在 Play List 查詢時
回傳對應的聲⾳檔來撥放。
Main Loop
Arduino Serial Sound library
Input signals Import sounds
Push sound info Lookup sound and play
Sound List Play List Event Control
14
(2)Event Control 架構
將來源於 Arduino 輸⼊訊號做區分,並⼀⼀進⾏分析。
左右腳踏板對應到 EMG 訊號,分析 EMG 訊號的取樣
標準差,如⼤於上限閾值則可判定腳抬起來,⼩於下限閾值
則判定放下,左腳放下對應⿎組的切換,右腳的踏下則將當
前撥放的聲⾳停⽌,以此做為制⾳踏板,若右腳的抬起則將
當前撥放的聲⾳停⽌,以此做為延⾳踏板。
⼿指彎曲模組搭配了琴鍵,當琴鍵開關被按下時,對彎
曲程度作⼒道分析,以此獲得特定被觸發的⾳⾼和對應⾳
量,將結果匯⼊撥放清單。
觸控模組共有四個按鍵區域,對應四個設定好的和弦,
也可設定⼀⼩節的分解和弦,收到觸控訊號時,查找設定好
的和弦組,將其放⼊ Play List。
(3)操作流程
⾸先,設定⾳源檔,腦波經過處理⽣成特定⾳⾼的聲
⾳,在實例上我們設定從低⾳ Do 到⾼⾳ Ti 共 21 個⾳⾼,
以此搭配琴鍵的 21 個⾳,同時,可以設定每個按鍵分別對應
的⾳⾼,可以去掉未使⽤的⾳來擴增⾳域,除了腦波以外,
也包括⿎的⾳源。
再來,量測⼼率的 BPM 並輸⼊,以此設定每⼩節的節
拍數和快慢。
接著設定和弦組,有同步和弦以及分解和弦兩種模式,
同步和弦可以⽤於簡單的⼀個觸控訊號對應⼀個和弦,分解
和弦則可設定⼀個觸控訊號對應⼀連串的聲⾳在特定的時間
點上撥放。
最後,設定節奏⿎組,在此輸⼊⼀⼩節內會不斷重複的
背景節奏,同時可以輸⼊好幾種節奏,並在之後透過腳的踩
踏來切換。
15
完成以上的設定流程,就可以透過觸控模組、琴鍵、腳
部踩踏來演奏樂曲。
(4) 軟體實施細則
使⽤ python 來實作(為⽅便閱讀,程式碼截圖不縮排)
⾸先 import 相關的函式庫
建⽴ Arduino 連線
設定節拍,及量測到的⼼率
初始化的按鍵、⼒道、踏板閾值等參數
設定⿎組的⾳源和節奏
設定琴鍵的⾳源
16
設定和弦
初始化 pygame 以及 pygame.mixer
讀取聲⾳檔
定義將聲⾳資訊放⼊ Play List 的函數
定義 drumGroup 類別⽤來控制節奏和⿎組的撥放
17
定義 chordGroup ⽤來控制和弦的撥放
初始化類別
進⼊主迴圈的前置動作,設定時間和清空的 Serial 訊號
接著進⼊主迴圈後 進⾏ Event Control 分析處理 Arduino serial 輸⼊訊號
18
Play List 中的聲⾳查找與撥放
19
最後是 Event Control 的與時間相關的控制訊號處理
3. 腦波分析(為⽅便閱讀,程式碼截圖不縮排)
聲⾳主要產⽣⽅式:
我們希望可以想辦法把腦波轉成聲⾳信號。我們決定把強度與⾓
度分開處理。
我們把聲⾳分段後,每⼀段都做 fft,並且取他的強度與⾓度,分別存起來。
取兩者的平均之後,將最低頻率的部分過濾,再把他們綜合起來。我們這麼處
理是因為,如果直接將腦波的紊亂的波形播放出來,將會雜亂不堪,⽽且因為
雜訊的⼲擾,這⼀段聲⾳並不能代表⼀個⼈獨特的⾃我。然⽽加起來再平均以
後,我們達成了以下效果:聲⾳因為變得簡單,⽽更具有協調性。⽽且因為
zero mean random variable 平均起來影響會⽐沒有平均前⼩了√n 倍,⼤幅的減
⼩了受到的影響,每個⼈的腦波聽起來也逐漸有了不同。
20
這個部分在於,把⼀個⼈的腦波在頻率軸上做重複。這麼做的理由很簡單,因
為⼀班的樂器的聲⾳,也會在頻率軸上做重複。我們在這裡是從⼀個叫 coeff 的
mapping,來決定各個頻段的放⼤倍率。
超過的,就補 0
這是這個 object 的 magic method, __call__
我們選擇使⽤這個 method 作為整合⽤的 function。
⾸先,做了 fft 得到⼀個腦波⽐較精練的表⽰式。
然後從外部讀取經過⼿動調整的參數。以表達各個頻段放⼤倍率。在頻率軸上
重複。
然後做完處理後,轉回 time domain,normalize 之後給予 exponential decay,因
為這樣聽起來⽐較像是聲⾳。
把我們事先準備好的腦波數據從外部圖取,並把資料夾準備好,檔名則是與原
本的相互對應。
使⽤剛剛整合⽤的__call__產⽣ data,並儲存成 wav 檔案
21
有了 wav 檔之後,我們就可以做以下處理:
將⼀段已經選好的聲⾳,調⾼或是降低頻率。
圖形不變,將 t 軸收縮或是伸展,如此⼀來就可以達到調整頻率的效果(想像
sine 波形左右拉開來,頻率就變低了)
這邊僅僅只是做 array initialization,以及 window 的選定。選擇 hanning
window 是因為如果是 hamming window 的話,受到左右兩個端點的影響較⼤,
fft 也會受到⽐較⼤的影響,⽽我們今天⽐較有興趣得是中⼼附近的頻率,因此
採⽤ hanning window。
對每⼀個區段都做:
取左右兩端的頻率,讓他們中間相互重疊也無所謂,因為我們只是希望可以做
⼀個 linear combination 來逼近中間的部分。我們保留左右兩端點的相位差,然
後整個重新調整,以期望可以跟相鄰的區域調和。最後我們直接把調整完的
22
time domain sequence 加回新的 array 上,⽽這個 array 也可以跟旁邊重疊無所
謂,因為 phase 已經調成⼀樣了,頂多就是相加性⼲涉⽽已。
因為考慮到前⾯有些部分有相加性⼲涉,因此做了 normalization 才 return
前⾯兩個 functions 加起來⼀起⽤,既改變頻率,⼜不改變⾧度。
將 file system 的檔名抓出來後,做以下處理:
1.使⽤ tqdm 監測進度,這部分會進⾏超過 1 個⼩時。
23
2.⽅便起⾒,新的檔名前部分與原本的檔名⼀樣,只是檔案類型不同。
3.讀取資料
4.將資料的最⼤頻率部分取出,因為這些聲⾳是直接從腦波產⽣的,因此
並沒有⼀個真正的頻率。這⼀步做的就是將它歸類,⽅便我們之後對應
到琴鍵的關係。
5.normalize 頻率以⽅便分類。
6.產⽣並存檔。
三、實驗結果
(⼀)硬體部份
1. 彎曲模組
2. EMG 電路
24
3. 琴鍵
(⼆)軟體部分
1. 主機操控
先以電腦鍵盤測試每個功能是否正確,分別為踏板、⿎組、
琴鍵、左⼿和弦伴奏、右⼿主旋律彈奏。以下連結為⼩星星
的測試: https://youtu.be/Jd9VUzZKgmk
2. 腦波分析
左圖為分析前,右圖為分析後。由上⽽下為全、𝛼、𝛽、𝛿、𝜃
25
(三)整合
將腦波分析後輸⼊軟體,結合硬體測試以下基本功能
以下為⽂字圖⽚敘述,圖⽚皆取⾃⽂末連結,可點開聆聽
1. 聲⾳強弱
2. ⿎組
3. 制⾳踏板
可發現波形的波峰有先上升後下降
的趨勢,符合當初彈奏希望的漸強
漸弱。
三根突起為腳踩踏,可⾒
踩完第⼀次後節拍啟動,
第⼆次後⿎組加⼊,第三
次踩下後等待節拍完成後
停⽌,符合期望。
紅線左邊為不斷彈奏同⼀個⾳,可看
⾒振幅衰減較平緩,紅線右邊為踩踏
踏板,衰減較快,此部分較為模糊,
建議聆聽 Demo
26
4. 右⼿旋律:確實可以彈奏聖誕歌,外婆的澎湖灣等歌曲,由圖
難以呈現,建議聆聽 Demo。
5. 左⼿伴奏
可⾒許多組重複出現的波形,為伴奏和弦,不同組為按不同象
限⽽呈現,最後雜亂的波形為測試同時按很多種所造成。
四、實際表演
Demo 照⽚如下
以下連結為 Demo 影⽚(含上述所有波形圖)
https://www.youtube.com/watch?v=5NHTXkETbDQ
五、未來展望
(⼀)素材⽅⾯的改進
1. 鋼琴鍵盤的製作可藉由雷射切割等技術
2. ⼿套應改為布⼿套並將彎曲模組縫上
3. 模組化及可重複利⽤性
4. 更加⼩巧輕薄,減少製作成本(時間成本&材料成本)
5. 凝膠是否能有替代品
27
(⼆)技術上改善
1. Real time 的⼼跳頻率,可由演奏者⾃⾏決定是否變速
2. 腦波分析⽅法模組化
3. 聲⾳品質的提升,⽬前聲⾳有點特別
六、內容分配
(ㄧ)實驗
王⼈出:腦波所有分析、腦波主機整合
熊政凱:主機端軟體、Arduino 主機整合
鄭謹譯:硬體所有焊接設計、Arduino code
(⼆)報告與 Demo 影⽚
王⼈出:腦波所有分析、腦波主機整合、展望
熊政凱:主機端軟體、Arduino 主機整合、動機
鄭謹譯:硬體所有焊接設計、Arduino code、影⽚剪輯、報告統整
七、參考資料
彎曲模組:http://yehnan.blogspot.com/2013/09/arduinoflexbend-sensor.html
觸控模組:http://itimewaste.blogspot.com/2014/12/arduino-code-for-ttp229-touch-
16-button.html
Pygame:https://www.pygame.org/news
PySerial:
https://swf.com.tw/?p=1188&fbclid=IwAR3SNF1GHxuNqiRGS5tVEUP
8Y3r2maF5xNZQ28q6VnUsCSEW6FsABvdgpek
Standard Deviation:
https://stackoverflow.com/questions/15389768/standard-deviation-of-a-
list?fbclid=IwAR15BDWC2BJjJRVat-810-
sSJc8Af1g4tkQNOOIAzGW0G0rblA3aVhXqrgA
LibROSA:https://librosa.github.io/librosa/
SciPy.org:https://scipy.org/