矩形波の作成方法 | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

簡単そうで意外と面倒な矩形波の作成を紹介します。
ウェブにも意外と落ちてないんですよね。

面倒なのは周期ごとに場合分けしないとならない点と、
位相と周波数のからみです。(sin関数の時なんかは周波数は考慮しなくてもそのまま渡せるんですが。)

では、サンプリング間隔nInterval(ms)のデータにおける矩形波のデータを作成してみます。

int nInterval // サンプリング間隔(ms)
double dbOffset // 縦軸オフセット(0点)
double dbAmp // 振幅
double dbFrequency   // 周波数
double dbPhase // 位相

for( nDataCnt = 0; nDataCnt < nDataNum; nDataCnt++ )
{
nRemain = (int)( nInterval * nDataCnt - 1000 * dbPhase / 360 ) % (int)( 1000 / dbFrequency );

if( 0 == nRemain || 500/dbFrequency == nRemain || -500/dbFrequency == nRemain)

adWaveData[ nDataCnt ] = dbOffset;

if( -1000 < nRemain && nRemain < -500/dbFrequency)

adWaveData[ nDataCnt ] = ( dbOffset + dbAmp );

else if( -500/dbFrequency < nRemain && nRemain < 0)

adWaveData[ nDataCnt ] = ( dbOffset - dbAmp );

else if( 0 < nRemain && nRemain < 500/dbFrequency)

adWaveData[ nDataCnt ] = ( dbOffset + dbAmp );

else if( 500/dbFrequency < nRemain && nRemain < 1000/dbFrequency)

adWaveData[ nDataCnt ] = ( dbOffset - dbAmp );
}

矩形波なのでとりうる値は、dbOffset + dbAmp、dbOffset - dbAmp、dbOffset
3種類なので右辺は簡単です。
2種類だと思いきや、中間のdbOffsetがあるのは、中途半端な周波数などの場合は
上限値⇔下限値に移行する際の点が未定義になって波形が切れたりしますのでご注意!

nRemainの計算の所ですが、
まずは nInterval * nDataCnt で現在の点の位置になります。
で、- 1000 * dbPhase / 360 の部分は位相ずれ分になります。
% (int)( 1000 / dbFrequency ) は周波数を考慮してます。

ちなみにsin波だとこれだけで済みます。

#define PAI (3.14159265358979323846)

int nInterval // サンプリング間隔(ms)
double dbTime // 時間
double dbOffset // 縦軸オフセット(0点)
double dbAmp // 振幅
double dbFrequency   // 周波数
double dbPhase // 位相

for( nDataCnt = 0; nDataCnt < nDataNum; nDataCnt++)
{
dbTime = ( nInterval * nDataCnt - 1000 * dbPhase / 360 );

adWaveData[ nDataCnt ] = ( dbOffset + dbAmp * sin( dbFrequency * dbTime / 1000 * 2 * PAI ) );
}

.wavファイル等自作で音源を作ったりするのに役にたつかと思います。その際はぜひ参考に。
一部数値がハードコーディングなのは、ご容赦を。。汗

次回は別の波形の紹介をしたいと思います。
では、また。