チーム15A6
課題名
ノイズキャンセリング
研究者名
黒河伸介
越川福美
概要
Wave geneを利用して出した音をPSoCにいれて、LCDに波形を表示させる
実装
Wavegeneでは、周波数と波形を指定できるので、そこから出した音をPSoCにつなぐ。
AD変換でデジタル数値に変換し、演算処理して、ノイズを除去する。
小さな音をノイズとしているので、振幅の小さな音を除去するため、割り算で余りを切り捨てている。
その値をDA変換して、スピーカーにつなぎ音を出す。
また、LCDに波形を出すようにしている。
LCD、PSoCの接続は以下の図1の写真のように表示されている。
図1 PSoCの写真
ソースコード
/* ========================================
* * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */
#include <device.h>
/* 定数の設定*/ #define DMA_1_BYTES_PER_BURST 1 //1バーストあたり1バイト転送 #define DMA_1_REQUEST_PER_BURST 1 //バーストごとに転送リクエスト #define DMA_1_SRC_BASE (CYDEV_SRAM_BASE) //転送元ソースのアドレス #define DMA_1_DST_BASE (CYDEV_PERIPH_BASE)
/*
*今回のソフトウェア上の制御は *AD変換 *DA変換 *LCD出力 *である。 */
uint8 wave[100] = {
0,0,0,0,0,0,0,0,0,0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0,0,0,0,0,0,0,0,0,0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0,0,0,0,0,0,0,0,0,0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0,0,0,0,0,0,0,0,0,0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0,0,0,0,0,0,0,0,0,0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
};
void main()
{
//AD変換で用いる変数(電圧値用)の初期化 int16 adcResult = 0; /* Variable declarations for DMA_1 */ uint8 DMA_1_Chan; //チャネル定義 uint8 DMA_1_TD[1]; //チャネルTD定義 int i,count=0; //AD変換器を起動させる ADC_DelSig_1_Start(); ADC_DelSig_1_StartConvert();
//転送先ディスティネーションのアドレス /* DMA Configuration for DMA_1 */ DMA_1_Chan = DMA_1_DmaInitialize( DMA_1_BYTES_PER_BURST, DMA_1_REQUEST_PER_BURST, HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE)); //( 1, 1, 0, 1) /* TDのアロケーション*/ DMA_1_TD[0] = CyDmaTdAllocate(); /* TDのコンフィギュレーション(引き数) */ CyDmaTdSetConfiguration(DMA_1_TD[0], sizeof(wave), DMA_1_TD[0], TD_INC_SRC_ADR); /* CyDmaTdSetAddress(td,転送元下位16bitアドレス. 転送先下位16bitアドレス) */ CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)wave), LO16((uint32)VDAC8_1_Data_PTR)); /* DMAチャネルとTDのイニシャライズ*/ CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]); /* DMAチャネルのイネーブル化*/ CyDmaChEnable(DMA_1_Chan, 1); /* Start the DAC */ VDAC8_1_Start(); //LCD start LCD_Char_1_Start(); LCD_Char_1_ClearDisplay(); for(;;) { if(ADC_DelSig_1_IsEndConversion(ADC_DelSig_1_WAIT_FOR_RESULT)) { //電圧値を取得し、変数化する(ここでAD変換される)。(16Bits) adcResult = ADC_DelSig_1_GetResult16(); /* *小さい音=ノイズ *小さい音(振幅が小さい)=電圧が低い *よって、値の小さい数(小さい音)を無視するために除算し、乗算をする(除算の余りを切り捨てる)。 */ wave[(count++)%100] = (adcResult/256)*256; } for(i=0;i<100;i++){ //waveの内容をLCDに出力する。 //LCDは16数までしか表示できないため、あまり演算を用いて表示する。 LCD_Char_1_DrawVerticalBG(1,i%16,1,wave[i]); } } /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
}
/* [] END OF FILE */
実行結果と考察
スピーカーにつないでノイズ除去した音を出すようにしたかったが、DA変換でうまく転送ができていないため、音が出なかった。
LCDでは波形が少し見にくくはあるが、出ているのに対して音が出ないということは、AD変換はうまくいっているので、その後の処理に問題があると考えられる。
LCDには、sin波や矩形波など、流した波形が正しくデジタル化されて表示されていた。
WaveGeneでは、一つの音だけでなく二つの音を出したりもできるので、ノイズ除去の確認をするのに、とても適していた。
そして、今回はただしくスピーカーから音を出せなかったが、出した音の波形を調べるのに、WaveSpectraというソフト利用すると、出た音の波形を調べることができる。
また、今回の装置ではWaveGeneを使って音を出したが、マイクをつないで実際に音を入れると、ノイズ除去を有効的に使用できるだろう。
振幅の小さな音だけを除去する、というやり方を今回したが、周波数によって高い音や低い音を除去する(フィルタ)こともうまく利用できたら、もっとうまくノイズを除去できるのではないか。
- 最終更新:2015-05-18 16:00:05