Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

音響音楽信号処理

ステレオ楽曲の位相差を確認できるフェーズメーターの作り方(極座標ベース)

前回の記事では,ステレオのL, R チャネルの信号を,リサージュ図形の として与えることで音の広がりを可視化しました. www.wizard-notes.com この記事では,直交座標 を極座標(絶対値と偏角) 表記にしたバージョンを紹介します. 参考: Goniometer Algo…

音の広がりや位相差を可視化するリサージュメーター(ゴニオメーター)のPython実装

DTMなどで音の広がり感を可視化するには,リサージュ図形に基づく方法があります. リサージュ リサジュー:Lissajousとは | 偏ったDTM用語辞典 - DTM / MIDI 用語の意味・解説 | g200kg Music & Software 2つの信号を元に作られるリサージュ図形を利用し,2…

PyQtGraph:3Dプロット (GLSurfacePlotItem, GLMeshItem) の高さ(z軸)で色を変える方法

PyQtGraph の3Dサーフェス/メッシュプロットでは,高さに応じて色を変えることができます。 具体的には,GLSurfacePlotItem もしくは GLMeshItem のコンストラクタのキーワード引数 としてshader='heightColor'を指定します. n_x, n_y = 128, 128 xy_init …

Python:PyQtGraphで2次元波動方程式の数値シミュレーションをリアルタイムプロット(有限差分法)

PyQtGraphで美しいリアルタイムプロットができることを最近知ったので、実装例として2次元波動方程式の数値シミュレーション(有限差分法)をリアルタイム実行・プロットしてみました。 実装のための数式導出と、PyQtGraphを使ったソースコードを合わせて紹…

Python: A特性や他の特性を使った周波数重み付けの実装 (聴感補正,騒音測定)

ある音に対して、人間が感じるうるささと音圧レベルの大きさは必ずしも一致していません。 以下の等ラウドネス曲線のように、音圧レベルと周波数によって人間の聴覚の感度は異なっています。 https://ja.wikipedia.org/wiki/音の大きさ そのため、音信号の分…

Python: waveモジュールをハックしてfloat形式のwavファイルを読み込みnumpy配列に変換する

問題 解決方法 waveモジュールのWav_readクラスをハック 検証 問題 www.wizard-notes.com 上記の実装の拡張として、Python の waveモジュールを使って32-bit or 64-bit float形式のwavファイル読込を追加しようとして試してみたところ、以下のようなエラーが…

Python: waveモジュールを使ったWAVファイル読み込みとNumPy化 (8-bit, 16-bit, 24-bit, 32-bit int)

前置き Python wave モジュール 実装/テスト 最後に Float形式のWAVファイルについて 前置き 音楽プレイヤーのような音楽ソフトウェアの開発では、まずオーディオファイルから時間信号を読み込む処理が第一歩となります。 オーディオファイルは数多くの種類…

Python: pypianorollを使ってMIDIデータをNumpy配列に変換し、マルチトラックをプロット

(トラック数,最短音符数,音高数) のnumpy配列になってしまえば煮るなり焼くなりこっちのもの pic.twitter.com/7WfjuAQujI— Kurene (@_kurene) 2021年3月28日 MIDI形式のデータは演奏の操作・記録方式として優れていますが、データ分析やプログラム上での編…

クロマベクトルから音程に基づく特徴量:調性中心を算出(和音分析,拍検出)

Detecting harmonic change in musical audio https://t.co/wwxJf1s5oq2006年の論文だけど不勉強なもので最近ようやく知りました…。クロマベクトルのピッチクラス12音の各強度を音程調和知覚に基づく2次元空間×3に飛ばして、それぞれの空間でのcentroidを特…

PythonとOpenCVでスペクトログラムを画像データ(jpeg, png)として保存

オーディオ信号のスペクトログラムをプロット/保存する方法としては、matplotlibのimshow()を使う方法がありますが、今回はスペクトログラムを純粋な画像データとして保存する方法を試してみました。 実装 import librosa import numpy as np import cv2 bi…

PythonでSSM(自己類似度行列)を使って楽曲構成(Aメロ,サビなど)を分析

計算機を使った音楽分析技術の一つとして、楽曲構成(Aメロ、Bメロ、サビ)を分析する方法があります。 しかし、日本語で技術の具体的な実現方法や実装について説明のある文献はあまり多くありません。また、Pythonの音楽分析ライブラリ LibROSA にはまだ実…

Python resampyで音声・音楽ファイルをリサンプリング(アップ/ダウンサンプリング)

サンプリング周波数変換(リサンプリング,アップ/ダウンサンプリング)は,非常によく利用されるオーディオファイル処理です。 ただ、リサンプリングは時間がかかる処理なので、なるべく高速なアルゴリズム・ライブラリを使いたいところです。 特に大量の…

Python matplotlibでスペクトログラムのリアルタイムでのプロット実装

Pythonのmatplotlibでリアルタイムスペクトログラム描画。音と同期再生を考えると、真面目に描画するのは全然間に合わないのでPyQtGraph使うべきで、多少サボっていい加減な描画でいいなら使えなくもないかも…という印象 pic.twitter.com/LNJCavKWRf— Kurene…

Python:soundfile を使ったオーディオファイル (.wav, .flac, .aiff, .raw, etc.) の読み書き

Python でオーディオファイルを読み込むライブラリは複数あります。 wave scipy.io.wavfile scipy.io.wavfile.read scipy.io.wavfile.write audiofile soundfile audioread librosa.load ぱっと見、どれを使えばよいか迷ってしまいますが、 様々なOSで動いて…

Python:LibROSAのLPC (線形予測分析)を使って音声・歌声分析

Pythonの音楽分析モジュールLibROSAには、v.0.7から線形予測分析(https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E4%BA%88%E6%B8%AC%E6%B3%95)を行う関数librosa.lpcが追加されました。 線形予測分析は音声の音素や声色を分析するのによく利用されていま…

Pythonとresample_polyでオーバーサンプリング

scipy.signal.resample_polyを使ってオーバーサンプリングを実装してみました。 resample_polyのデフォルトの設定では、パラメタβ=5.0のカイザー窓によるFIRローパスフィルタが使われています。 注意すべき箇所として、フィルタ長はresample_polyの引数では…

PythonのMDCT(修正離散コサイン変換)ライブラリ: mdct

MP3などで使われている周波数変換方法であるMDCT (Modified Discrete Cosine Transform)。 現状、Scipy等の準標準的なライブラリに関数はありませんが、以下のライブラリがありました。 GitHub - nils-werner/mdct: A fast MDCT implementation using SciPy …

双2次フィルタの自作Pythonライブラリ PyQuadFilter 更新 - フレームベース処理対応

双2次フィルタの自作Pythonライブラリである PyQuadFilterを更新しました。 PyAudioやPySoundDeviceと組み合わせることで、Pythonでも双2次フィルタを使った簡単なリアルタイム音響信号処理ができます。 GitHub - Kurene/pyquadfilter: Implementation of di…

PythonとMoSQIToで学ぶ、ラウドネス (sone) の算出および実装方法 (Zwicker method)

※ITU-R BS, 1770によるラウドネスレベルの算出は以下の記事をご覧ください。 www.wizard-notes.com はじめに ラウドネスの算出・実装方法の勉強のため、心理音響評価モジュール/開発フレームMoSQIToの非定常信号向けラウドネス(時変ラウドネス)算出モジュ…

Pythonの心理音響評価モジュール"MoSQITo"でオーディオデータからラウドネスを算出

前回の記事で紹介したPythonの心理音響評価モジュールMoSQIToでラウドネスを算出してみました。 基本的に以下のドキュメント・ソースコードを参考にしています。 MoSQITo/tuto3_Loudness-zwicker-time-varying.ipynb at master · Eomys/MoSQITo · GitHub ソ…

Pythonの心理音響評価モジュール/開発フレームワーク"MoSQITo"の紹介

https://github.com/Eomys/MoSQITo 心理音響学について調べていたら、興味深いPythonライブラリがあったので紹介します。 github.com 心理音響学に基づく音質評価ソフトウェアの多くは市販製品であり、オープンソースでさくっと使えるものはほとんどないのが…

双2次フィルタ (Biquad Filter) の周波数特性(振幅・位相)の一覧

以下の記事で作成した双2次フィルタのプログラムで出力した、双2次フィルタの周波数特性(振幅・位相)の一覧ページです。 www.wizard-notes.com カットオフ周波数 (fc) とQ値 (q) を動かしてプロットしています。 双2次フィルタ作成の参考等にご利用くださ…

pyloudnormで学ぶ平均ラウドネス値 (LKFS/LUFS) の算出・実装方法

※ISO 532 (Zwicker method) による推定ラウドネスおよびラウドネスレベルの算出は以下の記事をご覧ください。 www.wizard-notes.com 先日、下記の記事で統合ラウドネス値(Integrated loudness) LKFS/LUFS のPython実装 pyloudnorm をご紹介しました。 pylo…

双二次フィルタの係数導出/フィルタ処理が簡単にできるPythonライブラリ"PyQuadFilter"

K-weighting filter の実装の記事 を書いている時に、Python向けの双2次フィルタのライブラリがあったらいいなーと思ったので、年末年始の自由研究開発として作ってみました。 プロトタイプ版ですが、とりあえず公開します。 githubにあまり慣れていなかった…

numpy.errstateで対数をとった時のwarningを無視する

音信号処理のプログラムを書いていると、 import numpy as np y_array = np.log10(x_array) のように対数をとることがよくあります。 ここで、x_array には 0 が含まれていることが多々あり、その場合には RuntimeWarning: divide by zero encountered in lo…

pyloudnormで平均ラウドネス値 (LUFS) 算出/ラウドネス正規化

Pythonで平均ラウドネス値 (LUFS) を算出したりラウドネス正規化をすることができるモジュール pyloudnorm を試してみました。 https://github.com/csteinmetz1/pyloudnorm オフラインでの分析/加工を想定したような設計となっており、ラウドネスメータープ…

様々なサンプリング周波数に対応した K-weighting フィルタの設計

2021/1/3: alphaの算出方法がsin(w0)/Qとなっていたため、sin(w0)/(2Q)に修正 導入 ラウドネスメーターで使われるLKFSやLUFSの算出における信号処理の流れは、以下のブロック図のように、 K周波数重み付け(K-weighting) 各チャネルでエネルギーを計算し集…

Python PyFilterBankで環境音をオクターブバンド分析

はじめに 音信号の分析では、時間波形を直接分析するのではなく、様々な周波数分析手法を利用します。 比較的細かい周波数成分を見る方法としては、 STFT (短時間フーリエ変換) CQT (定Q変換) メルフィルタバンク がよく使われています。これらのライブラリ…

PyQtで作るdB単位の音量フェーダー

dB単位の音量フェーダー pic.twitter.com/mJK2E6RmnJ— Kurene (@_kurene) 2020年12月22日 PyQtで作るdB単位の音量フェーダーを作ってみました。 信号に乗算するゲイン係数は、音量フェーダーのdB値 x から、 として算出しています。 ソースコード GUI クリッ…

メロディ分析/抽出のための、librosa.salience() によるSalience (顕著性) スペクトログラムの算出

はじめに Python の音楽信号分析モジュールである LibROSAには、楽曲の音高/メロディ/和音情報をより精度よく抽出するためのツールとして、Salience (顕著性)スペクトログラムを抽出する関数 librosa.salience が実装されています。 今回は、librosa.sal…