方形波の生成

「方形波の生成」の編集履歴(バックアップ)一覧はこちら

方形波の生成」(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&amp;act=open&amp;pageid=227&amp;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&amp;act=open&amp;pageid=227&amp;file=square.png" alt="" /></p> <table width="600" border="1" cellpadding="1" cellspacing="1"><tbody><tr><td>#include &lt;stdio.h&gt; <div>#include &lt;stdlib.h&gt;</div> <div>#include &lt;string.h&gt;</div> <div> </div> <div> </div> <div>#define FileName "square.wav"</div> <div>//例&lt;全長:秒&gt;100 &lt;1サイクル:μ秒&gt;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-&gt;hdrRiff,STR_RIFF,sizeof wHdr-&gt;hdrRiff);   // RIFF ヘッダ</div> <div> </div> <div>    wHdr-&gt;sizeOfFile=sp-&gt;sizeOfData+sizeof(WrSWaveFileHeader)-8;// ファイルサイズ</div> <div> </div> <div>    strncpy((char *)wHdr-&gt;hdrWave,STR_WAVE,sizeof wHdr-&gt;hdrWave);   // WAVE ヘッダ</div> <div> </div> <div>    strncpy((char *)wHdr-&gt;hdrFmt,STR_fmt,sizeof wHdr-&gt;hdrFmt);      // fmt チャンク</div> <div> </div> <div>    wHdr-&gt;sizeOfFmt=sizeof wHdr-&gt;stWaveFormat;              // fmt チャンク,無圧縮wav は 16</div> <div> </div> <div>    wHdr-&gt;stWaveFormat.formatTag=1;                         // 無圧縮PCM = 1</div> <div> </div> <div>    wHdr-&gt;stWaveFormat.channels=sp-&gt;channels;               // ch (mono=1, stereo=2)</div> <div> </div> <div>    wHdr-&gt;stWaveFormat.samplesPerSec=sp-&gt;samplesPerSec;     // sampleng rate(Hz)</div> <div> </div> <div>    bytes = sp-&gt;bitsPerSample / 8;                          // bytes/sec</div> <div>    wHdr-&gt;stWaveFormat.bytesPerSec=</div> <div>                bytes * sp-&gt;channels * sp-&gt;samplesPerSec;   // bytes / sec</div> <div> </div> <div>    wHdr-&gt;stWaveFormat.blockAlign=bytes * sp-&gt;channels;     // byte/サンプル*チャンネル</div> <div> </div> <div>    wHdr-&gt;stWaveFormat.bitsPerSample=sp-&gt;bitsPerSample;     // 16 bit / sample</div> <div> </div> <div>    strncpy((char *)wHdr-&gt;hdrData,STR_data,sizeof wHdr-&gt;hdrData);   // dataチャンク</div> <div> </div> <div>    wHdr-&gt;sizeOfData=sp-&gt;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-&gt;samplesPerSec)</div> <div>                                            *(float)(sp-&gt;cycleuSec));</div> <div>    tempSampPerPriod/=(1000000.0f*2.0f);</div> <div>    sampPerPriod=(long)tempSampPerPriod;</div> <div>    if(sampPerPriod&lt;=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-&gt;samplesPerSec/(float)sampPerPriod/2.0f);</div> <div> </div> <div>    curSampling=0;</div> <div>    deltaPriod=1;</div> <div>    for (i = 0; i &lt; sp-&gt;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(&amp;wHdr, &amp;sp);</div> <div> </div> <div>if( wavWrite(FileName, &amp;wHdr, &amp;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>

表示オプション

横に並べて表示:
変化行の前後のみ表示: