チーム1845
課題名
マスキング効果のpSocによる再現
研究者名
土屋樹
山下大貴
永井一輝
参考研究
バンドパスフィルタとマスキング効果
マスキング効果とは、音に関する効果で、2つの音が打ち消しあうというものである。
例として、二人で同時に話をすると、お互いの声が打ち消しあって聞こえづらくなる。
今回は2つのスピーカを用意し、pSocがシリアル通信でPCからデータを受け取って、音を出力するという形にした。
(本来はpSocで音を拾って自分自身で判断をしたかったが、時間的制約と、電圧の問題から断念した。)
マスキング効果を検証するために、あえて2つの波を合成し、その中から1つのスピーカーから流れ出ているはずの帯域を抽出する。その抽出度が、もともとの波形といかに異なるかによって、それを「打消し度」というパラメータになるのである。
PCでのプログラムはCでは面倒なのでPythonで書いた。
既知の問題
のちの実践のために得た知見を残しておく。
結論から書くと、研究室のマシンで自由自在にPythonを動かすことはできない。
そして、Macでシリアル通信をして制御することは不可能である。
理由は以下。
6308の部屋のマシンでCygwin上で実行しようとしないほうがいい。pipインストールでは泥沼へはまるので、避けること。
(bashのバージョンアップはソースからのインストールで可能だが、Cygwinのフェイクパスの壁に阻まれてapt-cygができないためpipのインストールができない。easy_installを用いる方法は、Cygwinの再インストールが必要になるため、元の構成を理解していなければならず、少なくともこの年の担当者で元のCygwin構成が分かる人間がいないので、やらないほうがいい。さわらぬ神にたたりなしである。)
何か追加パッケージをするときには、自身のWindowsマシンを用いること。
筆者はOS X(High Sierra)でシリアル通信を試みたが、いずれにしてもデバイスドライバがかなり古く、うまく動作するかかなり怪しい(少なくとも今回は動かなかった)。OS Xでは/dev/tty.*として、デバイスファイルが生成されるはずであるが、lsusbなどのコマンドが応答しなくなるので、コードに書かれた識別子からデバイスドライバを調べた(台北市にある中国企業のデバイスドライバが見つかると思う)が、もしかしたらそもそもこの古臭いデバイスドライバを入れないほうがいいかもしれない。
もちこみのWindowsマシンでは、正しく動作する可能性があるデバイスドライバは入手できた。
PL2303_Prolific_DriverInstaller_v1.5.0.zip
をダウンロードした。これをドライバとして指定すると、びっくりマークがなくなって、Teratermでは通信できる。
そのほか、研究室のマシンでは、個々のモジュールのバージョンを合わせるのがかなり大変(python 2.6.7)なので、PySerialのインストールができない。
このWikiを基に制作する場合、環境はWindowsであり、独自に知見を用いて、Cygwinないし最近ではbash on windowsでもいいかもしれないが、とにかくGUIでもなんでもいいので、Pythonの実行環境を構築し、デバイスドライバーをインストールして実行したほうが良い。これにはかなり時間がかかる可能性があるため、物好きがやるのをおすすめする。
PSoC内部動作
プログラム
#include <m8c.h>
#include "PSoCAPI.h"
#pragma interrupt_handler myISR
int PW = 125;
int TC = 0;
int t = 1;
int period = 458;
int data = 0;
void myISR(void)
{
TC += 1; if(TC == t){ PWM16_1_WritePeriod(period); t += 1; period = period - 1; } else if(TC <= 400) PWM16_1_WritePeriod(0);
}
void main(void)
{
char * strPtr; UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE); M8C_EnableGInt ; PWM8_1_Start(); PWM16_1_Start(); UART_CPutString("¥r¥nPSoC Synthesizer V1.1 ¥r¥n"); Timer16_EnableInt(); while(1) { if(UART_bCmdCheck()) { if(strPtr = UART_szGetParam()) { UART_CPutString("Found valid command¥r¥nCommand =>"); UART_PutString(strPtr); UART_CPutString("<¥r¥nParamaters:¥r¥n"); // 音の設定 if (*strPtr=='q') PWM8_1_WritePeriod(229); else if(*strPtr=='w') PWM8_1_WritePeriod(204); else if(*strPtr=='e') PWM8_1_WritePeriod(182); else if(*strPtr=='r') PWM8_1_WritePeriod(172); else if(*strPtr=='t') PWM8_1_WritePeriod(153); else if(*strPtr=='y') PWM8_1_WritePeriod(136); else if(*strPtr=='u') PWM8_1_WritePeriod(121); else if(*strPtr=='i') PWM8_1_WritePeriod(115); else if(*strPtr=='s') Timer16_Start(); else if (*strPtr=='l'){ TC = 0; PWM8_1_WritePeriod(0); PWM16_1_WritePeriod(0); } else if(*strPtr=='f') TC = 400; else if(isdigit(*strPtr)){ data = atoi(strPtr); PWM8_1_WritePeriod(data); } } UART_CmdReset(); } }
}
本来の装置を作成するに至らなかったため、マスキング現象を体感するための簡易的な装置を作成した。
シリアル通信でコマンドを送信することにより、スピーカーから音を発するプログラムである。
スピーカーの役割は主に固定した音を鳴らすものと、時間によって少しずつ周波数の違う波を発するものの2つがある。
"q,w,e,r,t,y,u,i" は "ド、レ、ミ、ファ、ソ、ラ、シ、ド"
"s"で変化する周波数を発する動作の開始、"f"で周波数の固定、"l"で両方の音を消す動作に対応している。
また、固定したい周波数の作成には、数字を入力することでPeriodを直接変えることもできる。
各変数をリセットするにはリセットボタンを用いる。
Pythonでやりたかったことのソースコード
考察
要するに、http://mikamir.wiki.fc2.com/wiki/%E3%83%81%E3%83%BC%E3%83%A0173Aでは、動かない。我々はPython3で実行したが、もしかしたらこれPython2かもしれない。でも、pythonにおいてprintが文ではなく関数なので、たぶん3だと思う。
ただし、前述でこねくり回したように、この方法だとできない。できそうだけどできないので、Pythonをあきらめて、Processingに逃げよう。
- 最終更新:2018-10-23 17:47:10