サンプルプログラム1


サンプルプログラムの実行

 サンプルプログラムSample1を コンパイルして実行してみましょう。 コンパイル時に下記の警告が出ますが、無視してください。 最適化に関するものなので、動作には支障はありません。

Warning
実験装置の接続

 このプログラムは下図のような動作をします。 サンプリング周波数は48kHzで、約20kHzまでの音を処理できます。

Block diagram of Sample1
「Sample1」のブロック図

 まず、実験装置を下図のように接続します。 アナログ出力は8チャンネルあるので、 必要に応じてスピーカを差し替えてください。 CH4は、ピンジャックとヘッドホン端子に同じ信号が出力されるので、 どちらを使用してもかまいません。

 この接続方法でPCから音を出す時は、 音の再生デバイスを「SB Live! 24-bit External」にしてください。 「SoundMAX Digital Audio」になっている時、 PC内蔵スピーカから音が出ている時は、 設定変更が必要です。 「コントロールパネル」→「サウンド、音声、およびオーディオデバイス」 →「サウンドとオーディオデバイス」を起動し、 「オーディオ」タブの「音の再生 規定のデバイス」を 「SB Live! 24-bit External」に変更します。 画面右下のスピーカアイコンを右クリックしても 「サウンドとオーディオデバイス」を起動できます。

Connection
実験装置の接続

 プログラムをコンパイル、実行したら、マイクに向かって話したり、 PCから音を出したりしてみましょう。 特にPC用の音源 (CDやファイル) を用意していない場合には、 「マイ ミュージック」の「Sample Music」が利用できます。

サンプルプログラムの内容

 サンプルプログラムは10個以上のファイルから構成されています。 ここでは、サンプルプログラムを改造するために必要な部分にしぼって説明します。

 重要なファイルは下記の3個になります。

まず、「ProcessInput.c」を表示させてみましょう。 左側中段にある「Project: Sample1.dpj」と書かれたウインドウ (「プロジェクトウインドウ」) で、 「Source Files」と書かれたフォルダのアイコン左側にある「+」をクリックします。 ソースファイルの一覧が表示されるので、 表示・編集したいファイルをダブルクリックします。 下図のように、ソースファイルを編集するウインドウが開きます。 同様に、ヘッダファイルを表示・編集する場合には、 「Header Files」から開いていきます。

Open source window
ソースを開く

 「ProcessInput.c」は以下のようなプログラムです。 内容は、

  1. 3個のグローバル変数を定義
  2. 関数「Init()」を定義
  3. 関数「ProcessInput()」を定義
となっています。

////////////////////////////////////////////////////////////////////////////////////////
//
//Sample-based talkthrough for 4 inputs and 8 outputs
//  2 inputs from ADC, 2 inputs from SPDIF
//
//Original program "blockProcess.c" from Ez-Kit Lite example
//Modifided by Akihiro HIRANO <hirano@t.kanazawa-u.ac.jp>
//Last update: Apr 12, 2007
//
//History
//  Apr 06, 2007	First version
//  Apr 12, 2007	Blink control fix
////////////////////////////////////////////////////////////////////////////////////////
#include "tt.h"

#define DELAYLEN 48000

float *delay0;
float *delay1;
int delayptr = 0;

// Place the initialization code for the audio processing here.
void Init(void){
    delay0 = AllocFloat(DELAYLEN);        // Allocate large array on SDRAM
    delay1 = AllocFloat(DELAYLEN);
}

// Place the audio processing algorith here.
// The input and output are given as arrays of float.
void ProcessInput(void)
{
    static int count = 0;

    //Clear the Block Ready Semaphore
    //Do not modify.
    blockReady = 0;

    //Set the Processing Active Semaphore before starting processing
    //Do not modify
    isProcessing = 1;


    output_buf[0] = input_buf[0];                       // Analog Right to CH1 Right
    output_buf[1] = input_buf[1];                       // Analog Left  to CH1 Left
    output_buf[2] = input_buf[2];                       // SPDIF Right  to CH2 Right
    output_buf[3] = input_buf[3];                       // SPDIF Left   to CH2 Left

    output_buf[4] = delay0[delayptr];
    output_buf[5] = delay1[delayptr];
    output_buf[6] = delay0[delayptr];
    output_buf[7] = delay1[delayptr];
    delay0[delayptr] = input_buf[0] + input_buf[2];     // Analog Right + SPDIF Right
    delay1[delayptr] = input_buf[1] + input_buf[3];     // Analog Left + SPDIF Left

    if (++delayptr == DELAYLEN)                         // Ring buffer
        delayptr = 0;

    // Blink LED 1
    count++;
    if ((count & 0x0fff) == 0) {
        if (count & 0x8000) {
            OffLED(1);
        }
        else {
            OnLED(1);
        }
    }

    //Clear the Processing Active Semaphore after processing is complete
    //Do not modify
    isProcessing = 0;
}

 信号処理の主要部分は関数「ProcessInput()」です。 入力信号が1組揃う度に呼び出され、出力信号を計算します。

 この関数は、 float型の配列input_buf[4]に格納されている 入力信号を処理して、 処理結果をfloat型の配列output_buf[8]に格納します。 入力信号はアナログオーディオ入力右、左、 SPDIFディジタルオーディオ入力右、左の順に格納されています。 出力信号は、CH1右、左、…CH4右、左の順になります。 信号値は-1〜+1の単精度実数です。 これを超える値を出力しようとしても-1〜+1の範囲に打ち切られます。

 関数「ProcessInput()」の先頭にある 「blockReady = 0;」と 「isProcessing = 1;」、 最後にある「isProcessing = 0;」の3行は変更しないでください。 変更するとプログラムが正常に動作しなくなることがあります。

 関数「Init()」は、 プログラムの実行開始時に一度だけ呼び出されます。 メモリの確保、初期値の設定などを行います。 このサンプルプログラムではメモリの確保を行っています。 関数「AllocFloat()」は 「malloc()」と同じような動作をする関数です。 4MワードのSDRAMに領域を確保し、その先頭へのポインタを返します。 ただし、割り当てられた領域を開放する関数はありません。

サンプルプログラムの改造

 サンプルプログラムを改造して、動作が変化するかどうかを確認しましょう。 チャンネルを入れ替える、定数倍するなどが簡単でしょう。 出力が2チャンネルで済む場合には、 CH4 右/左 (output_buf[6], output_buf[7]) を使うと、スピーカをヘッドホン端子に直結できるので接続が楽です。


[上へ] [戻る コンパイル、実行、停止] [目次] [次へ 制限事項と拡張機能]