Output the audio signal with filtering by IIR filter in the *.wav file on the SD card using onboard CODEC. SD カードの *.wav ファイルのオーディオ信号を遮断周波数可変の IIR フィルタを通して,ボードに搭載されているCODEC で出力する.

Dependencies:   BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed FrequencyResponseDrawer F746_SAI_IO Array_Matrix

Committer:
MikamiUitOpen
Date:
Tue Apr 19 09:46:11 2016 +0000
Revision:
0:04b43b777fae
Child:
11:769d986c10fa
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:04b43b777fae 1 //--------------------------------------------------------------
MikamiUitOpen 0:04b43b777fae 2 // SD_WavReader class
MikamiUitOpen 0:04b43b777fae 3 // SD カードの *.wav ファイルの内容を読み出す
MikamiUitOpen 0:04b43b777fae 4 // 以下のフォーマット以外は扱わない
MikamiUitOpen 0:04b43b777fae 5 // PCM,16 ビットステレオ,標本化周波数 44.1 kHz
MikamiUitOpen 0:04b43b777fae 6 //
MikamiUitOpen 0:04b43b777fae 7 // 2016/04/19, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:04b43b777fae 8 //--------------------------------------------------------------
MikamiUitOpen 0:04b43b777fae 9
MikamiUitOpen 0:04b43b777fae 10 #include "SD_WavReader.hpp"
MikamiUitOpen 0:04b43b777fae 11
MikamiUitOpen 0:04b43b777fae 12 namespace Mikami
MikamiUitOpen 0:04b43b777fae 13 {
MikamiUitOpen 0:04b43b777fae 14 SD_WavReader::SD_WavReader(int32_t bufferSize)
MikamiUitOpen 0:04b43b777fae 15 : STR_("sd"), ok_(false)
MikamiUitOpen 0:04b43b777fae 16 {
MikamiUitOpen 0:04b43b777fae 17 sd_ = new SDFileSystem(STR_.c_str());
MikamiUitOpen 0:04b43b777fae 18 sd_->mount();
MikamiUitOpen 0:04b43b777fae 19
MikamiUitOpen 0:04b43b777fae 20 buffer = new int16_t[bufferSize*2];
MikamiUitOpen 0:04b43b777fae 21 }
MikamiUitOpen 0:04b43b777fae 22
MikamiUitOpen 0:04b43b777fae 23 SD_WavReader::~SD_WavReader()
MikamiUitOpen 0:04b43b777fae 24 {
MikamiUitOpen 0:04b43b777fae 25 delete[] buffer;
MikamiUitOpen 0:04b43b777fae 26 sd_->unmount();
MikamiUitOpen 0:04b43b777fae 27 delete sd_;
MikamiUitOpen 0:04b43b777fae 28 }
MikamiUitOpen 0:04b43b777fae 29
MikamiUitOpen 0:04b43b777fae 30 void SD_WavReader::Open(const string fileName)
MikamiUitOpen 0:04b43b777fae 31 {
MikamiUitOpen 0:04b43b777fae 32 string name = (string)"/" + STR_ + "/" + fileName;
MikamiUitOpen 0:04b43b777fae 33 fp_ = fopen(name.c_str(), "rb");
MikamiUitOpen 0:04b43b777fae 34 if (fp_ == NULL) ErrorMsg("open error!!");
MikamiUitOpen 0:04b43b777fae 35 }
MikamiUitOpen 0:04b43b777fae 36
MikamiUitOpen 0:04b43b777fae 37
MikamiUitOpen 0:04b43b777fae 38 // ファイルのヘッダ (RIFFxxxxWAVEfm ) 読み込み
MikamiUitOpen 0:04b43b777fae 39 // 戻り値: *.wav で,16 ビットステレオ,
MikamiUitOpen 0:04b43b777fae 40 // 標本化周波数:44.1 kHz の場合 true
MikamiUitOpen 0:04b43b777fae 41 bool SD_WavReader::IsWavFile()
MikamiUitOpen 0:04b43b777fae 42 {
MikamiUitOpen 0:04b43b777fae 43 char data[17];
MikamiUitOpen 0:04b43b777fae 44 fread(data, 1, 16, fp_);
MikamiUitOpen 0:04b43b777fae 45 string strRead = "";
MikamiUitOpen 0:04b43b777fae 46 for (int n=0; n<4; n++) strRead += data[n];
MikamiUitOpen 0:04b43b777fae 47 for (int n=8; n<16; n++) strRead += data[n];
MikamiUitOpen 0:04b43b777fae 48
MikamiUitOpen 0:04b43b777fae 49 // "RIFF", "WAVE", "fmt " が存在することを確認
MikamiUitOpen 0:04b43b777fae 50 if (strRead != "RIFFWAVEfmt ") return false;
MikamiUitOpen 0:04b43b777fae 51
MikamiUitOpen 0:04b43b777fae 52 // fmt chunck のサイズを取得
MikamiUitOpen 0:04b43b777fae 53 uint32_t fmtChunkSize;
MikamiUitOpen 0:04b43b777fae 54 fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_);
MikamiUitOpen 0:04b43b777fae 55
MikamiUitOpen 0:04b43b777fae 56 // PCM, Stereo, 44.1 kHz, 16 bit であることを確認
MikamiUitOpen 0:04b43b777fae 57 WaveFormatEx fmtData;
MikamiUitOpen 0:04b43b777fae 58 fread(&fmtData, fmtChunkSize, 1, fp_);
MikamiUitOpen 0:04b43b777fae 59 if ((fmtData.wFormatTag != 1) ||
MikamiUitOpen 0:04b43b777fae 60 (fmtData.nChannels != 2) ||
MikamiUitOpen 0:04b43b777fae 61 (fmtData.nSamplesPerSec != 44100) ||
MikamiUitOpen 0:04b43b777fae 62 (fmtData.wBitsPerSample != 16)
MikamiUitOpen 0:04b43b777fae 63 ) return false;
MikamiUitOpen 0:04b43b777fae 64
MikamiUitOpen 0:04b43b777fae 65 // data chunk を探す
MikamiUitOpen 0:04b43b777fae 66 char dataId[5];
MikamiUitOpen 0:04b43b777fae 67 dataId[4] = 0;
MikamiUitOpen 0:04b43b777fae 68 fread(dataId, 1, 4, fp_);
MikamiUitOpen 0:04b43b777fae 69 if ("data" != (string)dataId)
MikamiUitOpen 0:04b43b777fae 70 for (int n=0; n<100; n++)
MikamiUitOpen 0:04b43b777fae 71 {
MikamiUitOpen 0:04b43b777fae 72 char oneByte;
MikamiUitOpen 0:04b43b777fae 73 fread(&oneByte, 1, 1, fp_);
MikamiUitOpen 0:04b43b777fae 74 for (int k=0; k<3; k++)
MikamiUitOpen 0:04b43b777fae 75 dataId[k] = dataId[k+1];
MikamiUitOpen 0:04b43b777fae 76 dataId[3] = oneByte;
MikamiUitOpen 0:04b43b777fae 77 if ("data" == (string)dataId) break;
MikamiUitOpen 0:04b43b777fae 78
MikamiUitOpen 0:04b43b777fae 79 if (n == 99) return false;
MikamiUitOpen 0:04b43b777fae 80 }
MikamiUitOpen 0:04b43b777fae 81
MikamiUitOpen 0:04b43b777fae 82 // データサイズ (byte) を取得
MikamiUitOpen 0:04b43b777fae 83 int32_t sizeByte;
MikamiUitOpen 0:04b43b777fae 84 fread(&sizeByte, sizeof(int32_t), 1, fp_);
MikamiUitOpen 0:04b43b777fae 85 size_ = sizeByte/4;
MikamiUitOpen 0:04b43b777fae 86
MikamiUitOpen 0:04b43b777fae 87 ok_ = true;
MikamiUitOpen 0:04b43b777fae 88 return true;
MikamiUitOpen 0:04b43b777fae 89 }
MikamiUitOpen 0:04b43b777fae 90
MikamiUitOpen 0:04b43b777fae 91 // ファイルからデータの取得
MikamiUitOpen 0:04b43b777fae 92 void SD_WavReader::Read(int16_t data[], uint32_t size)
MikamiUitOpen 0:04b43b777fae 93 {
MikamiUitOpen 0:04b43b777fae 94 if (!ok_) ErrorMsg("Get data FAILED");
MikamiUitOpen 0:04b43b777fae 95 fread(data, sizeof(int16_t), size, fp_);
MikamiUitOpen 0:04b43b777fae 96 }
MikamiUitOpen 0:04b43b777fae 97
MikamiUitOpen 0:04b43b777fae 98 // ファイルからデータをモノラルに変換しての取得
MikamiUitOpen 0:04b43b777fae 99 void SD_WavReader::ReadAndToMono(int16_t data[], uint32_t size)
MikamiUitOpen 0:04b43b777fae 100 {
MikamiUitOpen 0:04b43b777fae 101 if (!ok_) ErrorMsg("Get data FAILED");
MikamiUitOpen 0:04b43b777fae 102 fread(buffer, sizeof(int16_t), size*2, fp_);
MikamiUitOpen 0:04b43b777fae 103 for (int n=0; n<size; n++)
MikamiUitOpen 0:04b43b777fae 104 data[n] = (buffer[2*n] + buffer[2*n+1])/2;
MikamiUitOpen 0:04b43b777fae 105 }
MikamiUitOpen 0:04b43b777fae 106
MikamiUitOpen 0:04b43b777fae 107 // データサイズ(標本化点の数)の取得
MikamiUitOpen 0:04b43b777fae 108 int32_t SD_WavReader::GetSize()
MikamiUitOpen 0:04b43b777fae 109 {
MikamiUitOpen 0:04b43b777fae 110 if (!ok_) ErrorMsg("Get data size FAILED");
MikamiUitOpen 0:04b43b777fae 111 return size_;
MikamiUitOpen 0:04b43b777fae 112 }
MikamiUitOpen 0:04b43b777fae 113 }