Waveデータ (PCM)

かなり涼しくなってきましたね。涼しいというか日によっては朝寒く感じるようになってきました。私はもともと暑いのが苦手なのでようやく体が楽になってきた感じでしょうか。仕事がら外出も多いのでかなり助かります。夏はなんといってもスケジュールが詰まっていて、時間の関係から早歩きで移動した後などは地獄です。特に霞が関の役所のビルはどこも空調が弱いので本当に辛いです。外部の方々を集めた会議の時だけでも涼しくして欲しい。

ところで、しばらく前にWaveDataの作成プログラムを紹介したのですが、久しぶりにその時に書いたコードを見直して気が付きました。何に気が付いたかというと、窓掛。そのときのポストでは作成した音がブチブチとノイズが入ると書いていましたが、よく考えたら当たり前で窓掛けしてないから。ずいぶんとボケたものです。基本中の基本をそのときに気づけない、思い出せないとは恥ずかしい限りです。趣味のプログラムなので、時間かけてコード書いても仕方ないので、取り合えず修正したものを紹介しておきます。

//=====================================================================================

/// <summary>

///

/// </summary>

/// <param name=”bw“></param>

/// <param name=”nAmplitude“></param>

/// <param name=”nFrequency“></param>

/// <param name=”nDuration“></param>

/// <returns></returns>

private int WriteOutSound(int nAmplitude, int nFrequency, int nDuration)

{

        double                   dA;

        double                   dDeltaFT;

        int                              nSamples;


                        

        dA                       = ((nAmplitude * 2 ^ 15) / 1000) -1;

        System.Diagnostics.Debug.WriteLine(dA.ToString());

                        

        if (nFrequency == 0)

        {

                // 周波数ゼロの場合

                dA              = 0;

                dDeltaFT = Math.PI * 2 * (double)0 / (double)SamplingRate;

        }

        else

        {

                dDeltaFT = Math.PI * 2 * (double)nFrequency / (double)SamplingRate;

        }


        // どの程度窓掛するかの計算。単純に両端の10msに対して適用。

        nSamples = (SamplingRate * nDuration / 100) / 10;


 &
nbsp;     
for (int T = 0; T < nSamples; T++)

        {

                short Sample;

                double dADegree;


                // 先頭の窓掛

                if (T < WindowPeriod)

                {

                         dADegree = Math.PI / 2 * (1.0 – (double)T / (double)WindowPeriod);

                }

                // 後尾の窓掛

                // これをやらないと、ブチブチとノイズ

                else if (T > nSamples – WindowPeriod)

                {

                         dADegree = Math.PI / 2 * ((double)(WindowPeriod – (nSamples – T)) / (double)WindowPeriod);

                }

                else

                {

                         dADegree = 0;

                }


                Sample = (short)(dA * Math.Sin(dDeltaFT * T) * Math.Cos(dADegree));

                bwWave.Write((short)Sample);

                bwWave.Write((short)Sample);

        }

                        

        return nSamples;

}

取り敢えず、ちょっとしたモールス信号練習ソフトウェアということで・・
ZIP

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です