Wizard Notes

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

Python

Overlap-Add法・Overlap-Save法(重畳加算法,重畳保留法)のPython実装

音信号処理の代表例として、コンボリューションリバーブ*1のような入力信号にインパルス応答を畳み込む処理が挙げられます。 この畳み込み演算をリアルタイムのブロック処理で実現する*2実用的な方法としては、 Overlap-Add法とOverlap-Save法が有名です。 …

Pythonで空間音響(バイノーラル)用ファイル形式 SOFA を処理(pysofaconventions)

需要が高まってきているバイノーラル処理にチャレンジする場合、まずはWeb上のSOFA形式のHRTFデータで試すことが多いかと思います。 Pythonであれば、SOFA形式のデータ読み込んで Numpy配列にさえ変換すればバイノーラル処理やプロットは容易です。 そこで、…

シュレーダーリバーブ(人工残響エフェクタ)のPython実装と試聴デモ

今回は,以下の記事で紹介したオールパスフィルタによる残響生成を用いて、実用的な残響エフェクタとして有名なシュレーダーリバーブをPythonで実装してみました。 www.wizard-notes.com シュレーダーリバーブの概要 フィードバック型コムフィルタの回路につ…

Python:直列オールパスフィルタによる人工残響の生成と試聴

「信号処理に欠かせないオールパスフィルタ―」で紹介したオールパスフィルタの利用例として、人工残響フィルタを実装してみました。 設計方法 フィルタ応答の比較 試聴 Python実装 参考文献 設計方法 直列オールパスフィルタによる人工残響生成はシュレーダ…

Python:ヒルベルト変換で様々な信号の包絡線,瞬時位相,瞬時周波数を抽出

音の時間波形の包絡線を抽出や振幅変調(AM)の復調などで利用されるヒルベルト変換をPythonで実装し、いくつかの簡単な信号に対して適用してみました。 ヒルベルト変換の概要 ヒルベルト変換の仕組みや実装方法については、以下のWebページがわかりやすいで…

リアルタイム雑音抑圧処理:適応線スペクトル強調器 (ALE) のPython実装と適用例

音信号向けの簡単かつ実用的なリアルタイム向け雑音抑圧処理として,以下の書籍で適応線スペクトル強調器 (ALE) が紹介されていました. 上記の書籍を参考にしつつ,Pythonでの適応線スペクトル強調器 (ALE)の実装と,様々な信号への適用例を紹介します。 適…

和音のモダリティ(明るいー暗い/嬉しいー悲しい)を算出するモダリティ曲線 (Modality Curve) のPython実装

不協和度、緊張度に引き続き、“The Psychophysics of Harmony Perception: Harmony is a Three-Tone Phenomenon” より和音の明るさー暗さや嬉しさー悲しさを表すとされる和音のモダリティの算出モデルについて紹介します。 また、モダリティ曲線を算出するPy…

和音の緊張度を算出する緊張度曲線 (Tension Curve) のPython実装

前回に引き続き、“The Psychophysics of Harmony Perception: Harmony is a Three-Tone Phenomenon” より和音の心理数理モデルのPython実装を行います。 今回は、和音の緊張度を分析する数理モデルを扱います。 用途としては、減3和音や増3和音のような緊張…

和音の協和度を算出する不協和度曲線 (Dissonance Curve) のPython実装

和音の響きはその音楽の雰囲気を分析する重要な要素です。 長/短3和音のような明るい/悲しいといった響きから、ジャジーな和音の複雑で豊かな響きまで様々です。 このような和音の響きを計算機で分析する方法はいくつかあります。 今回は、和音がどのくら…

1次IIRオールパスフィルタでローパス/ハイパスフィルタを作る(Python実装)

「信号処理に欠かせないオールパスフィルタ―の概要・使い方・利用例」では、オールパスフィルタによって低演算量で様々な周波数特性のフィルタを作成できることを紹介しました。 www.wizard-notes.com この記事では、その具体例として1次IIRオールパスフィル…

信号処理に欠かせないオールパスフィルタ―の概要・使い方・利用例

※2022/9/28: λの算出式の符号が間違っていたためプロットとともに修正 信号処理におけるフィルタとしては、ローパス/ハイパスフィルタのような振幅特性を活用するフィルタが良く知られています。 しかし、一方で位相特性のみに影響を与えるオールパスフィル…

Python:エフェクター(音響効果処理)を簡単に実装・リアルタイム再生できるクラスの作成

入出力の管理リアルタイム音響信号処理を使った身近な機器としては、ボーカルやギターなどの楽器で利用されているエフェクターが挙げられます。 エフェクターは信号処理としては簡単なのですが、実際にPCでプログラミングをして音を出力するのは準備が割と大…

Python:numba (jit)で音響信号処理の高速化 - 2次IIRフィルタの処理時間計測

数値計算でよく利用されている Python (CPython) ですが、for文の処理が遅いという問題点があります。 音響信号処理ではC/C++風に配列の各要素にアクセスが必要な処理を for文を使って実装することが多いため、これは致命的です。 そこで、Python用のjitコン…

適応逆ノッチフィルタによるサイン波/調波成分の抽出(Python実装)

前回紹介した適応ノッチフィルタ は、正弦波信号を除去するアルゴリズムでした。 www.wizard-notes.com www.wizard-notes.com しかし、音楽信号処理でよくある楽音を抽出したいという要求には適応ノッチフィルタは利用しにくいです。 そこで今回は、正弦波信…

多段適応ノッチフィルタで複数の正弦波を除去/ドラム・打楽器音の抽出(Python実装)

前回の記事では、適応ノッチフィルタを使って音高が未知の正弦波を除去しました. www.wizard-notes.com しかし、正弦波が複数ある区間ではうまく動作しませんでした。 そこで、今回は複数の正弦波を除去できる、多段適応ノッチフィルタを紹介します。 また…

Python:sounddeviceを使った音声ファイルの再生・リアルタイム処理の実装方法

以下の記事では,Pythonで音の再生・録音を行うためのライブラリ sounddevice を紹介しました。 Python-sounddevice で音声や歌声をリアルタイム収音・再生・録音 - Wizard Notes この記事では、音の信号処理/アプリ開発でよく使う、音声ファイルの再生をso…

Python:適応ノッチフィルタで正弦波(周期性雑音)を除去

音響信号処理の良い参考書である プログラム101付き 音声信号処理 では、適応信号処理の一例として適応ノッチフィルタが紹介されています。 ただし、プログラムがC言語のみであり、また、数学的な説明が僅かであるため仕組みが分かりにくいです。 そこで、適…

グラフィックイコライザの周波数特性を補正するための最小二乗法による利得最適化

前回は、単純なグラフィックイコライザとして、1/Nオクターブバンドごとに双二次フィルタを用意し直列接続した実装を解説しました。 www.wizard-notes.com しかし、この手法だと、グラフィックイコライザ全体の周波数特性として各中心周波数での振幅値が指定…

Python:1/1, 1/3オクターブバンド グラフィックイコライザの実装

音源制作の現場で最も利用されているプラグインの一つとして、ある周波数帯域を増幅/減衰させるイコライザがあります。 その一種であるグラフィックイコライザをPythonで実装してみます*1。 グラフィックイコライザについて オクターブバンド分割(中心周波…

Python:PyQtでQMainWindowに非依存な複数のQWidgetを同時に表示する

www.wizard-notes.com 上記の例の派生版です。 やりたいこととしては、 複数ある QWidget (個々のGUI)を表示 ここのQWidget はQMainWindowと結合していない QMainWindowは与えられた複数の QWidget を表示する となります。 なお、下記の例ではQMainWindow…

pyrirtool: Pythonで手軽にインパルス応答を測定・録音できるツール

音響分野において指数チャープ信号などを使ったインパルス応答の測定は非常に重要ですが、測定条件に対して柔軟に対応できる測定用ソフトウェアを自前で用意するのは結構手間です。 そこで、Pythonで手軽に利用できるインパルス応答測定ツール pyrirtool を…

Python:Spleeter にNumpy配列を与え、ボーカル・ベース・調波楽器を抽出してクロマベクトルを算出する

https://github.com/deezer/spleeter より 前回の記事では、Python向け楽器分離ライブラリ Spleeter の使い方を紹介しました。 具体的には、2-mixの楽曲ファイルを、ボーカルやベース、ドラムといったオーディオファイルに分離する方法を紹介しました。 Pyth…

Pythonでボーカル・ドラム・ベース・伴奏を抽出できる楽器分離ライブラリ Spleeter の使い方・デモ

https://github.com/deezer/spleeter より 楽曲のメロディ・和音・リズムといった音楽的分析を行うには、個々の構成楽器ごとの分析が重要です。 楽譜・MIDIファイルは情報が各トラックごとに分かれているため メロディ・和音・リズムといった音楽的要素・文…

LibROSAの音響特徴量を使って楽曲のサビを自動で検出する (librosa.feature.rms, librosa.feature.spectral_centroid)

ポピュラー音楽では、楽曲の聞かせどころであるサビは楽曲の最も盛り上がる部分であり、その楽曲の印象に深くかかわります。 サビ検出には様々な手法がありますが、今回は実装が簡単な手法として音響特徴量を使ったサビ検出手法を実装・検証してみました。 …

scipy.signal.oaconvolve:FIRフィルタの畳み込み演算を効率的に行うオーバーラップ加算法の使い方と計算速度について

はじめに 音信号処理では音を加工する1つの方法としてFIRフィルタがよく使われます。 具体的な計算としては、元の信号とFIRフィルタ信号の畳み込み演算を行います。 この畳み込み演算を時間領域で素直に行うと、元の信号長×FIRフィルタ長の計算が必要です。 …

Python (Anaconda) の再インストール後に起動しないエラーへの対処(環境変数の設定)

エラー内容 解決策 エラー内容 環境:Win10 Visual Studio でインストールしたPython (Anaconda) をアンインストールし、Python.orgのインストーラを使ってPythonを再導入した際に発生したエラーです。 なお、Python.orgのインストーラだけでなくMiniconda …

Python:PyQtで複数の画面/ウィンドウ (Widget) を表示する

元ネタ: www.pythonguis.com PyQtを使って実用的なアプリを作ろうとすると、描画や設定などの画面を個別に表示するために複数ウィンドウを実装したいことがあります。 まず、素直に以下のようなコードを実装・実行してみます。 import sys from PyQt5.QtWid…

高次のバターワースフィルタ(ハイパス)の不安定性について scipy.signal.butterworth

マルチバンド処理用のフィルタバンク実装でバターワースフィルタによるハイパスフィルタを使おうとすると,7次くらいから周波数応答が不安定になりました. ハイパスフィルタ 周波数応答をプロット してみると,scipy.signal.butterworthのハイパスフィルタ…

Python:変数がNumPy配列かどうか判別する方法

Pythonで数値計算や信号処理をしていると,NumPy配列かどうか判別したいことがあります. import numpy as np np_array = np.array([0, 1, 2]) type(np_array) #=> <class 'numpy.ndarray'> type(python_list) #=> <class 'list'> 以上の例から NumPy配列とPythonのリストオブジェクトは異なるため</class></class>…

Python:マルチバンド処理用フィルタバンクのクラス設計・実装・動作検証

以前の記事では,木構造のような信号処理フローのマルチバンド処理を紹介しました. この記事では、実装・利用しやすさに着目して信号処理フローを再設計・実装します。 設計 以前の記事では木構造の処理フローでしたが,今回は低域のカットオフ周波数から徐…