Pythonでお手軽音声処理(4) 色々な波の生成

シェアする

  • このエントリーをはてなブックマークに追加

こんにちは、ふるやん(@furuya1223)です。

Python音声処理シリーズ、第4弾です。

前回は音声波形の表示を行いました。

今回は、正弦波や矩形波など、基本的な波を作成し、WAVファイルとして書き出したいと思います。

今回も作成したプログラム全体をGitHubリポジトリで公開しています。

できるようになること

好きな周波数の、正弦波・矩形波・ノコギリ波・三角波を作成できるようになります。

モスキート音を作成できるようになります。悪用はダメよ。

下準備

矩形波・ノコギリ波・三角波の生成には、scipy.signal を使用するので、インポートします。

今回のインポートは以下のようになります。

また、main関数をシンプルにするため、音声の書き出しと前回の波形表示を、関数化しておきましょう。

こうすると、show_waveform(data, rate) で音声波形を表示してくれますし、xlimなどを設定すると表示範囲を変えられます。xlabel や title なども設定可能です。

音声の保存は、save('output.wav', data, rate) のように行います。

いろいろな波の生成

周波数と長さを指定して、正弦波・矩形波・ノコギリ波・三角波を生成します。

正弦波

正弦波、その名の通り sin(x) のグラフで表される、最も基本的な波です。英語では sinusoid とも呼ばれます。

numpy の np.sin() 関数で生成します。

リスト内包表記を使うと楽に書けます。

上記の関数を用意し、main関数から 440 Hz、5 秒間の正弦波を作成してみます。振幅はとりあえず 0.5 にしておきます。

rateでサンプリングレートを指定しています。今回は 44.1 kHz にしています。ここで指定する値の半分の周波数(今回は 22050 Hz)よりも高い音は作成できないので気を付けてください。

生成される音と画像は以下のようになります。

(音量注意!)

画像は、最初の 0.01 秒間の部分を拡大表示しています。

プーっという音が鳴りますね。これが正弦波です。

矩形波

矩形波は、その名の通り長方形の形をした波です。パルス波とも呼ばれます。

scipy.signal.square() で作成できます。

この関数は、引数に rad 単位の位相を入力すると、2π 周期で矩形波の値を出力します。つまり、0~π で 1、π~2π で -1、2π~3π で 1、……を出力します。

そのため、正弦波のときに用いた引数をそのまま使います。

作成される音声は以下のようになります。

(正弦波よりも大きな音が鳴ります!!音量注意!!)

レトロゲームで聞くような音色ですね。

正弦波よりも高音成分が多いので、音が大きく感じます。(詳しい話は次回)

ノコギリ波

ノコギリの歯のような波形です。

矩形波と同じく、scipy.signal.sawtooth() で生成できます。

これまたレトロゲームにありそうな音ですね。矩形波の方が綺麗な音ですかね?

三角波

二等辺三角形が並ぶギザギザの波形です。

scipy.signal.sawtooth() には、1周期のどこでピークになるかを決めるパラメータ width があります。

デフォルトでは 1 になっており、これは周期の最後にピークになり、直後に-1に落下するということを表します。

この値を 0.5 にすると、周期の真ん中でピークになり、周期の後半で -1 まで下がっていく波形が作成できます。

形が正弦波に似ているので、音も正弦波に近いですね。

矩形波やノコギリ波と違って、一瞬で値が変化するところが無いので、やわらかい音になっています。

モスキート音を聞いてみる

モスキート音とは、めっちゃ高い音のことです。

16000 Hz ぐらいの音を指すことが多いですかね。

このぐらいの高さになると、聞こえる人と聞こえない人に分かれます。

特に、加齢とともに高音の聴力が低下するらしく、モスキート音は「若者にしか聞こえない」と言われます。

しかも、中途半端に聞こえると不快です。

そのため、東京のどこかの駅では、入り口のドア付近でこの音を流し、若者がたむろするのを防いでいます。私も聞いたことありますが、ぼんやり頭が痛くなるようで不快でした。

せっかくなので 16000 Hz の正弦波を作ってみました。

(不快感注意)

音量が小さいと聞こえないと思います。

音量を上げると、音が聞こえるというより先に不快感が来るような気がします。

再生したり止めたりすると、音が分かると思います。

これずっと聞くのは無理ですね。

自分の耳が何Hzまで聞き取れるのかを試してみるのも面白いと思います。

まとめ

  • 正弦波の作成は np.sin()
  • 矩形波の作成は scipy.signal.square()
  • ノコギリ波の作成は scipy.signal.sawtooth()
  • 三角波の作成は scipy.signal.sawtooth() で width パラメータを 0.5 にする

次回はフーリエ変換を行ってスペクトルとスペクトログラムを表示したいです。

スポンサーリンク
レクタングル(大)
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする