チーム15A6

課題名


ノイズキャンセリング

研究者名


黒河伸介
越川福美

概要


Wave geneを利用して出した音をPSoCにいれて、LCDに波形を表示させる

実装


Wavegeneでは、周波数と波形を指定できるので、そこから出した音をPSoCにつなぐ。

AD変換でデジタル数値に変換し、演算処理して、ノイズを除去する。
小さな音をノイズとしているので、振幅の小さな音を除去するため、割り算で余りを切り捨てている。

その値をDA変換して、スピーカーにつなぎ音を出す。
また、LCDに波形を出すようにしている。
LCD、PSoCの接続は以下の図1の写真のように表示されている。

1431932094699.jpg
図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

このWIKIを編集するにはパスワード入力が必要です

認証パスワード