2020.06.22 波形処理 第1回 音の波と三角関数
YouTubeでポイントを説明しています。画像をクリックすると再生できます。
新シリーズとして波形処理を追加しました。波形処理を通じて、音楽に関する理解を深めることが目的です。
第1回は、音の基本となる波を、三角関数を使って作り出します。
■開発環境
パソコンから、TeraTeamでラズパイにSSH接続、python によるコーディングを行い、実行します。
また、DACにI2S接続して音を鳴らします。
DACとの接続設定は、
I2S通信によるハイレゾ音源再生
を参照してください。
ラズパイのディストリビューションには、Raspbian Stretch を使用していますが、これから導入する際には、Raspbian Buster になります。
■予備知識
まずは、こちらの論文を一読されると、理解が深まると思います。
一般の方でも読みやすく、楽しめる内容になっています。
楽典の補足資料として、またシンセサイザーに興味のある方にも十分役立つ論文です。
音の波と三角関数
小林 亮 広島大学大学院理学研究科
■波を作り出す
半径1の円周上を座標(1,0)から、反時計回りに移動した場合の軌跡を、横軸に角度(ラジアン)、縦軸に振幅(高さ,Y座標)で示すと右側の波形で表現されます。
πはラジアン単位系の表記方法と考えてください。そしてPythonのライブラリで使われる三角関数でもこの単位系が使われています。
変に2×π=2×3.1415926・・・=6.28311852・・・とか考えてしまうと訳がわからなくなります。
反時計回りに90℃回転したら、1/2π、180℃でπ、1周で2π、2周で4πという尺度で考えましょう。
また、音ってなんでこんな形をしているんだろうと考えると、謎が深まるばかりで、最終的には拒絶反応を起こしてしまいます。
これは音の実態ではなく、音の特徴を視覚的に捉えるうえで、なにかと便利なので、こういう形で表現をしていると思ってください。
■波形を表示する
では、最初にPythonでこの波形を表現してみます。
数学関数ライブラリ numpy のインストール
numpy(ナムパイ)ライブラリは、多次元配列を操作するための数学関数ライブラリです。
$ sudo pip3 install numpy
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages
※Python3をインストールした際に、一緒にインストールされていると思います。
グラフ描画ライブラリ matplotlib のインストール
matplotlib(マットプロットリブ)は、NumPyのためのグラフ描画ライブラリです。
$ sudo pip3 install matplotlib
Requirement already satisfied: matplotlib in /usr/lib/python3/dist-packages
※Python3をインストールした際に、一緒にインストールされていると思います。
$ vi sinecurve.py
import matplotlib.pyplot as plt
import numpy as np
if __name__ == '__main__':
# radian値を生成(0~2πラジアンまでを、2π/360刻みで配列に格納する)
radian = np.arange(0, 2*np.pi, 2*np.pi/360)
# 振幅(Y座標)を計算
amplitude = np.sin(radian)
# 結果表示
plt.plot(radian, amplitude)
plt.show()
plt.close()
$ python3 sinecurve.py
プログラムの実行は、VNCを利用するか、ラズパイで直接行って接続しているモニターに結果を表示させてください。
■スワップ領域拡張
次に、楽器を演奏する際の音合わせにも利用される440Hzのラの音を生成して、WAVファイルに保存してみましょう。
上記では、1周期分の波の振幅を360個の観測点で採取してグラフに表しましたが、実際の録音ではより細かく観測点を設けて、振幅の値を取得しています。
例えば、ラの音をサンプリング周波数44.1kHz で録音する際には、1秒間に発生する440回の波を、44100個の観測点で採取することになり、座標計算に大量のメモリを消費します。
Raspbian Stretch の初期状態でのスワップ領域として割り当てられているスワップファイルは、100Mバイトです。
$ free
total used free shared buff/cache available
Mem: 443076 96920 152964 7596 193192 275280
Swap: 102396 0 102396
これでは計算処理中に、MemoryError を起こします。
Raspbianでは、/etc/dphys-swapfileでスワップ領域の設定を行っています。
まずは、このファイルを編集して、スワップファイルのサイズを拡張します。
$ sudo vi /etc/dphys-swapfile
#CONF_SWAPSIZE=100
CONF_SWAPSIZE=2048
サービスを起動します。
$ sudo dphys-swapfile install
want /var/swap=2048MByte, checking existing: deleting wrong size file (104857600), generating swapfile ... of 2048MBytes
スワップ領域を有効にします。
$ sudo dphys-swapfile swapon
スワップファイルが2Gバイトに拡張されます。
$ free
total used free shared buff/cache available
Mem: 443076 97484 149428 7596 196164 274688
Swap: 2097148 0 2097148
■システム・バックアップ
スワップファイルは頻繁に更新されます。SDカードには書き込み回数上限があるので、突然SDカードが使えなくなる事態を想定しなければなりません。
開発環境を1から構築しなおすのは、とても面倒なので、SDカードをバックアップしておきます。
Raspbian Stretch (あるいはBuster)をインストールした際に使用したSDカードと同じものを用意すると問題が発生しません。
■ラ(440Hz)の音を録音する
ここでは、ラ(440Hz)の音を生成して、WAVファイルに保存します。
scipy(サイパイ)ライブラリのインストール
scipy.ioにあるwavfileの読み書きクラスを使って、音声ファイル(wavファイル)を保存します。
$ sudo apt-get install python3-scipy
※scipyを、pip でインストールしようとすると、うまくいかないことがあるようです。
$ vi savewave.py
import numpy as np
from scipy.io import wavfile
if __name__ == '__main__':
frequency = 440.0 # 生成周波数
playbackTime = 1.0 # 再生時間
samplingRate = 44100 # サンプリング周波数
slice = 2*np.pi*frequency / samplingRate
radian = np.arange(0, 2*np.pi*frequency*playbackTime, slice)
amplitude = np.sin(radian)
# 16bit の wav ファイルに書き出す
amplitude = (amplitude * float(2 ** 15 - 1)).astype(np.int16)
wavfile.write("La.wav", samplingRate, amplitude)
今度は、円周上1回転分ではなく、440回転分を、等間隔に44100の観測点で振幅を測定しています。
再生時間を1秒にしていますが、単純なラの音だけの録音なので、2秒にしても同じパターンが繰り返されるだけです。
振幅を16ビットの整数値に変換している部分では、振幅を最大限に引き伸ばしていますが、音を合成する際には、調整が必要になります。
writeにパラメータを引き渡すことで、自動的にwavファイルのヘッダー情報を付加した形て保存されます。
コードを実行します。
$ python3 savewave.py
■直接、音を鳴らす
必要なパッケージをインストールします。
$ sudo pip3 install pyaudio
$ sudo apt-get install portaudio19-dev
音を再生するのに利用できるデバイスについて調べます。
$ python3
>>> import pyaudio
>>> p = pyaudio.PyAudio()
ALSAのエラーメッセージは無視して続けます。
>>> for index in range(0, p.get_device_count()):
... print(p. get_device_info_by_index(index))
...
{'maxInputChannels': 0, 'index': 2, 'defaultLowInputLatency': -1.0, 'defaultHighOutputLatency': 0.034829931972789115, 'defaultHighInputLatency': -1.0, 'defaultLowOutputLatency': 0.005804988662131519, 'name': 'snd_rpi_hifiberry_dac: - (hw:1,0)', 'defaultSampleRate': 44100.0, 'hostApi': 0, 'structVersion': 2, 'maxOutputChannels': 2}
I2S接続している PHAT DAC は、hifiberry_dac なので、インデックス番号2であることがわかります。
WAVファイルに保存していた部分を、サウンドデバイス出力用に書き換えます。
output_device_index に、上記インデックス番号の2 を指定しています。
$ vi playback.py
import pyaudio
import numpy as np
if __name__ == '__main__':
frequency = 440.0 # 生成周波数
playbackTime = 1.0 # 再生時間
samplingRate = 44100 # サンプリング周波数
slice = 2*np.pi*frequency / samplingRate
radian = np.arange(0, 2*np.pi*frequency*playbackTime, slice)
amplitude = np.sin(radian)
# 16bit の wav ファイルに書き出す
amplitude = (amplitude * float(2 ** 15 - 1)).astype(np.int16)
# ストリームを開く
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=samplingRate,
output=True,
output_device_index=2)
# 音声を再生
stream.write(amplitude)
stream.close()
p.terminate()
$ python3 playback.py
440Hzのラの音が鳴れば、成功しています。
ALSAのエラーメッセージを表示したくない場合は、エラーハンドラーを設置します。
$ vi playback.py
from ctypes import *
import pyaudio
import numpy as np
ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p)
def py_error_handler(filename, line, function, err, fmt):
pass # print('%s:%s %s %s' % (line, filename, function, err))
c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)
asound = cdll.LoadLibrary('libasound.so')
if __name__ == '__main__':
# Set error handler
asound.snd_lib_error_set_handler(c_error_handler)
frequency = 440.0 # 生成周波数
playbackTime = 1.0 # 再生時間
samplingRate = 44100 # サンプリング周波数
slice = 2*np.pi*frequency / samplingRate
radian = np.arange(0, 2*np.pi*frequency*playbackTime, slice)
amplitude = np.sin(radian)
# 16bit の wav ファイルに書き出す
amplitude = (amplitude * float(2 ** 15 - 1)).astype(np.int16)
# ストリームを開く
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=samplingRate,
output=True,
output_device_index=2)
# 音声を再生
stream.write(amplitude)
stream.close()
p.terminate()
# Reset to default error handler
asound.snd_lib_error_set_handler(None)
■参考文献
小林 亮 広島大学大学院理学研究科 - 音の波と三角関数
SciPy.org - scipy.io.wavfile.write
PythonからPyAudioで録音/再生してみる
python - PyAudioは動作しますが、毎回エラーメッセージを吐き出します
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81
無水エタノールP 500mlx2個パック(掃除)
ケイバ(KEIBA) マイクロニッパー MN-A04
サンハヤト SAD-101 ニューブレッドボード
白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02
[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠
|