「方形波の生成」の編集履歴(バックアップ)一覧はこちら
「方形波の生成」(2013/03/24 (日) 14:40:37) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><b>方形波を作成します。</b><b><br /></b></p>
<p><b><a href="http://www.rikakoubou.com/oshiro.html">http://www.rikakoubou.com/oshiro.html</a></b><br /><b>こちらの『オシロくん』というソフトで波形を表示させてみました。</b></p>
<p><img src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=227&file=square.png" alt="" /></p>
<table width="600" border="1" cellpadding="1" cellspacing="1"><tbody><tr><td> </td>
</tr></tbody></table><p> </p>
<p><b>方形波を作成します。</b><b><br /></b></p>
<p><b><a href="http://www.rikakoubou.com/oshiro.html">http://www.rikakoubou.com/oshiro.html</a></b><br /><b>こちらの『オシロくん』というソフトで波形を表示させてみました。</b></p>
<p><img src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=227&file=square.png" alt="" /></p>
<table width="600" border="1" cellpadding="1" cellspacing="1"><tbody><tr><td>#include <stdio.h>
<div>#include <stdlib.h></div>
<div>#include <string.h></div>
<div> </div>
<div> </div>
<div>#define FileName "square.wav"</div>
<div>//例<全長:秒>100 <1サイクル:μ秒>20000</div>
<div>#define Cycle 5000 //1サイクル [u sec]</div>
<div>#define Length 50 //全長 [sec]</div>
<div>#define Max 10000</div>
<div>#define Min -10000</div>
<div> </div>
<div>// defines</div>
<div>#define STR_RIFF "RIFF"</div>
<div>#define STR_WAVE "WAVE"</div>
<div>#define STR_fmt "fmt "</div>
<div>#define STR_data "data"</div>
<div> </div>
<div>#define WAV_MONAURAL 1</div>
<div>#define WAV_STEREO 2</div>
<div> </div>
<div>#pragma pack(push,1)</div>
<div>struct WaveFileHeader{</div>
<div> char Riff[4]; // RIFFヘッダ</div>
<div> unsigned int FileSize; // ファイルサイズ - 8</div>
<div> char Wave[4]; // WAVEヘッダ</div>
<div>};</div>
<div> </div>
<div>struct TagChank{</div>
<div> unsigned char Fmt[4]; // fmt チャンク</div>
<div> unsigned int FmtSize; // fmt チャンクのバイト数</div>
<div>};</div>
<div> </div>
<div>struct WaveFormat{</div>
<div> unsigned short FormatTag; // フォーマットID</div>
<div> unsigned short Channels; // チャンネル数</div>
<div> unsigned int SamplingRate; // サンプリングレート</div>
<div> unsigned int BytesPerSec; // データ速度 (Byte/sec)</div>
<div> unsigned short BlockAlign; // ブロックサイズ</div>
<div> unsigned short BitsPerSample; // サンプルあたりのビット数</div>
<div>};</div>
<div> </div>
<div>struct WrSWaveFileHeader</div>
<div>{</div>
<div> unsigned char hdrRiff[4]; // 'RIFF'</div>
<div> unsigned int sizeOfFile; // ファイルサイズ - 8</div>
<div> unsigned char hdrWave[4]; // 'WAVE'</div>
<div> unsigned char hdrFmt[4]; // 'fmt '</div>
<div> unsigned int sizeOfFmt; // sizeof( PCMWAVEFORMAT )</div>
<div> struct {</div>
<div> unsigned short formatTag; // WAVE_FORMAT_PCM</div>
<div> unsigned short channels; // number of channels</div>
<div> unsigned int samplesPerSec; // sampling rate</div>
<div> unsigned int bytesPerSec; // samplesPerSec * channels *
(bitsPerSample/8)</div>
<div> unsigned short blockAlign; // block align</div>
<div> unsigned short bitsPerSample; // bits per sampling</div>
<div> } stWaveFormat; // PCMWAVEFORMAT</div>
<div> unsigned char hdrData[4]; // 'data'</div>
<div> unsigned int sizeOfData; // Waveデーターサイズ</div>
<div>};</div>
<div> </div>
<div>//関数間の引数</div>
<div>struct TagParam</div>
<div>{</div>
<div> unsigned int sizeOfData; // Waveデーターサイズ</div>
<div> unsigned short channels; // チャンネル数</div>
<div> unsigned int samplesPerSec; // Hz</div>
<div> unsigned int bytesPerSec; // バイト数/sec</div>
<div> unsigned short bitsPerSample; // 8 bits or 16 bits</div>
<div> long posOfData; // position of begnning of WAV
datas</div>
<div> long cycleuSec; // 間隔:μ秒</div>
<div>};</div>
<div>#pragma pack(pop)</div>
<div> </div>
<div>WaveFileHeader waveFileHeader;</div>
<div>WaveFormat waveFmtPcm;</div>
<div>TagChank chank;</div>
<div> </div>
<div>// wav ヘッダ作成</div>
<div>void setupHeader(WrSWaveFileHeader* wHdr, TagParam* sp)</div>
<div>{</div>
<div> unsigned short bytes;</div>
<div> </div>
<div> strncpy((char *)wHdr->hdrRiff,STR_RIFF,sizeof wHdr->hdrRiff);
// RIFF ヘッダ</div>
<div> </div>
<div> wHdr->sizeOfFile=sp->sizeOfData+sizeof(WrSWaveFileHeader)-8;//
ファイルサイズ</div>
<div> </div>
<div> strncpy((char *)wHdr->hdrWave,STR_WAVE,sizeof wHdr->hdrWave);
// WAVE ヘッダ</div>
<div> </div>
<div> strncpy((char *)wHdr->hdrFmt,STR_fmt,sizeof wHdr->hdrFmt);
// fmt チャンク</div>
<div> </div>
<div> wHdr->sizeOfFmt=sizeof wHdr->stWaveFormat; // fmt
チャンク,無圧縮wav は 16</div>
<div> </div>
<div> wHdr->stWaveFormat.formatTag=1; // 無圧縮PCM =
1</div>
<div> </div>
<div> wHdr->stWaveFormat.channels=sp->channels; // ch
(mono=1, stereo=2)</div>
<div> </div>
<div> wHdr->stWaveFormat.samplesPerSec=sp->samplesPerSec; //
sampleng rate(Hz)</div>
<div> </div>
<div> bytes = sp->bitsPerSample / 8; //
bytes/sec</div>
<div> wHdr->stWaveFormat.bytesPerSec=</div>
<div> bytes * sp->channels * sp->samplesPerSec; // bytes
/ sec</div>
<div> </div>
<div> wHdr->stWaveFormat.blockAlign=bytes * sp->channels; //
byte/サンプル*チャンネル</div>
<div> </div>
<div> wHdr->stWaveFormat.bitsPerSample=sp->bitsPerSample; // 16
bit / sample</div>
<div> </div>
<div> strncpy((char *)wHdr->hdrData,STR_data,sizeof wHdr->hdrData);
// dataチャンク</div>
<div> </div>
<div> wHdr->sizeOfData=sp->sizeOfData; // データ長
(byte)</div>
<div>}</div>
<div> </div>
<div> </div>
<div>//wav データ書き込み</div>
<div>int writeWaveData(FILE *fpOut, TagParam* sp)</div>
<div>{</div>
<div> unsigned int i;</div>
<div> long curSampling, sampPerPriod, deltaPriod;</div>
<div> float tempSampPerPriod;</div>
<div> short Out[2];</div>
<div> </div>
<div> </div>
<div> tempSampPerPriod=(float)((float)(sp->samplesPerSec)</div>
<div>
*(float)(sp->cycleuSec));</div>
<div> tempSampPerPriod/=(1000000.0f*2.0f);</div>
<div> sampPerPriod=(long)tempSampPerPriod;</div>
<div> if(sampPerPriod<=0)</div>
<div> {</div>
<div> printf("周波数が高すぎます.\n");</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> printf("デジタルで処理するため実際の周波数は %.2f [Hz]です.\n",</div>
<div>
(float)sp->samplesPerSec/(float)sampPerPriod/2.0f);</div>
<div> </div>
<div> curSampling=0;</div>
<div> deltaPriod=1;</div>
<div> for (i = 0; i < sp->sizeOfData / sizeof Out ; i++)</div>
<div> {</div>
<div> if(curSampling==0)</div>
<div> deltaPriod=1;</div>
<div> if(curSampling==sampPerPriod)</div>
<div> deltaPriod=-1;</div>
<div> </div>
<div> if(deltaPriod==-1)</div>
<div> Out[0]=Out[1]=Max;</div>
<div> else</div>
<div> Out[0]=Out[1]=Min;</div>
<div> </div>
<div> if(fwrite(Out, sizeof Out, 1, fpOut) != 1)</div>
<div> return -1;</div>
<div> </div>
<div> curSampling+=deltaPriod;</div>
<div> }</div>
<div> </div>
<div> return 0;</div>
<div>}</div>
<div> </div>
<div>// ファイル内容書き出し</div>
<div>int wavWrite(char *outFile, WrSWaveFileHeader *wHdr, TagParam* sp)</div>
<div>{</div>
<div> FILE *fpOut;</div>
<div> </div>
<div> if((fpOut = fopen(outFile, "wb")) == NULL)</div>
<div> {</div>
<div> printf("%s をオープンできません.\n", outFile);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> // wav ヘッダ書き込み</div>
<div> if(fwrite(wHdr, sizeof(WrSWaveFileHeader), 1, fpOut) != 1)</div>
<div> {</div>
<div> printf("ヘッダを書き込めません: %s\n", outFile);</div>
<div> fclose(fpOut);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> // wav データ書き込み</div>
<div> if(writeWaveData(fpOut, sp)!=0)</div>
<div> {</div>
<div> printf("wavDataWriteでエラー発生.\n");</div>
<div> fclose(fpOut);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> fclose(fpOut);</div>
<div> </div>
<div> return 0;</div>
<div>}</div>
<div> </div>
<div>void main(int argc, char *argv[]){</div>
<div>TagParam sp;</div>
<div>WrSWaveFileHeader wHdr;</div>
<div> long totalLength;</div>
<div> </div>
<div> totalLength=Length;</div>
<div> sp.cycleuSec=Cycle;</div>
<div> </div>
<div> printf("%d [sec.]のファイルを作ります.\n",totalLength);</div>
<div> printf("1 cycleは %d [μsec.]です.\n",sp.cycleuSec);</div>
<div> </div>
<div> sp.channels=WAV_STEREO; // mono/stereo</div>
<div> sp.samplesPerSec=44100; // Hz</div>
<div> sp.bitsPerSample=16; // bytes/sec</div>
<div> sp.sizeOfData= // ファイルサイズ</div>
<div> (sp.bitsPerSample/8)</div>
<div> * sp.channels</div>
<div> * sp.samplesPerSec</div>
<div> * totalLength;</div>
<div> </div>
<div> setupHeader(&wHdr, &sp);</div>
<div> </div>
<div>if( wavWrite(FileName, &wHdr, &sp)!=0){ // write L,R wav
files.</div>
<div>printf("エラー\n",sp.cycleuSec);</div>
<div> return ;</div>
<div>}</div>
<div> </div>
<div> printf("\n%s を生成しました.\n", FileName);</div>
<div>getchar();</div>
<div> return;</div>
<div>}</div>
</td>
</tr></tbody></table><p> </p>