JUCEチュートリアル、Introduction to DSP、デジタル信号処理の概要とDSPモジュールについて調査

DSPのチュートリアルをしっかりとやっていきたいと思います。

概念的な部分はいろいろ別の資料を参考にしないとわからないよね~

JUCEチュートリアルの、「Introduction to DSP」内、「What is DSP?」と「The signal processing lifecycle」の項目についてわからない点などについて追加調査しつつ、理解を深めました。疑問点もそのまま疑問として残しつつ、今後の勉強の方向性としていきたいなと思います。かなり、脳内の考えをそのまま記載しておりますので、読みにくい点があると思います、ご了承くださいませ。

公式のチュートリアルはこちらです。

目次

こんな人の役に立つかも

・デジタル信号処理を知らないけどJUCEでプラグインが作成したい人

・デジタル信号処理(DSP)を調べているけれど、よくわからない人

・JUCEチュートリアルのIntroduction to DSPをやっている人

デジタル信号処理について

デジタル信号処理は、英語で「Digital Singal Processing」なので、DPSと略します。デジタルな信号の処理の対象となるデータは、音声、画像、光などがあります。JUCEでのDSPは、基本的にデジタル信号が音声信号となります。

おそらく、株価データもデジタル信号のように扱うことができそうなので、DSPといわれたときには、対象となる信号のジャンルはすべてのデジタルデータが含まれるような気がします。

JUCEは、音声に対する信号処理を行います。

チュートリアルによると、DSPでは、以下の領域での処理があるようです。チュートリアルの英語を翻訳してみました。

DSPの3つの領域

時間領域

翻訳)一次元の信号で時間を基準にして解析を行う、ということです。

横軸が時間、縦軸がゲイン(音量)のような音声信号に対する処理、というようなイメージですが、これだと2次元?になるのでしょうか。1次元の信号は、時間以外の次元(ゲインのみの1次元配列のイメージ)に対して処理を行うという意味にもとることができます。

Wikipediaの時間領域を参照すると、この理解で正しそうです。音声信号の時間領域は、ゲイン値の羅列のデータということになります。

プログラム的には、一次元配列にゲイン値が格納されて並んでいるようなイメージになります。

空間領域

翻訳)多次元の信号で、ある特定の空間を基準にして解析を行う。

音声信号での空間領域という点がまだいまいち理解しきれていません。多チャンネルということなのか、ゲイン、時間、位相または、ゲイン、時間、周波数のように、3次元的な表現をした信号を処理するということなのか、私の浅い知識ではまだピンと来ていません。

空間領域を調べてみると、2次元の空間として、画像の周波数領域への変換というものが出てきます。現段階では、多次元での解析もできるのかな、という理解にとどめておきます。

周波数領域

翻訳)時間又は空間を周波数で表す特定の領域、ということです。

音声信号においては、周波数は、音の高さとして知覚できます。フーリエ変換という処理を行うことで、時間領域の音声信号を周波数領域に変換したり、また、逆フーリエ変換で時間領域の音声信号に戻したりできます。先ほどの Wikipediaの時間領域 の右にある動く画像が直感的でわかりやすいです。

音声処理のDSPにおいて、①の時間領域での処理は、「フィルター」を主に勉強して、③の周波数領域について「FFT」を勉強するというような雰囲気がしています。実際に、本チュートリアルでの次の2項の解説は、FFTとデジタルフィルタの設計に関する説明となっています。

FFTについて

FFTは、FastFourierTransformの略で、計算機が高速にフーリエ変換できるように工夫したアルゴリズムです。フーリエ変換は、時間領域の信号を周波数領域へ変換することができる便利なツールです。

本ブログでも、スペクトログラムの実装チュートリアルでFFTについて勉強しました。

最低限のフーリエ変換の知識を調査

スペクトログラムのデモアプリを実装

スペクトログラム描画処理の詳細

JUCEのDSPモジュールには、「juce::dsp::FFT」クラスに実装されていますので、関数の使い方(関数の入出力)がわかれば、FFTに関する複雑な数学的知識がなくても、利用することができるようになっています。

デジタルフィルタデザインについて(FIR/IIR)

デジタルフィルタは、時間領域の音声信号の周波数を変化させて出力してくれます。イコライザ(EQ)の機能になります。デジタルフィルタには、ハイパスフィルターやバンドパスフィルターなど、いろいろな種類のものがあり、これらを組み合わせたりしてEQのような周波数を変化させる機能が実現します。

フィルタも音声の周波数を変化させることができるのですが、FFTで周波数領域に変換できるなら、フィルターって必要ないのでは?と思っていました。フーリエ変換のチュートリアルを行うとわかるのですが、フーリエ変換は音を変化させるという目的よりは、周波数の解析を行うという利用法になります。周波数領域に変換したときに、サンプリングレートの設定値や、音声バッファの大きさで、任意の間隔毎の周波数が取得できるというものなので、入力信号そのものの周波数というより、近似値のイメージになります。また、低い周波数を取得資料とすると、より長い音声データのバッファが必要になるので、リアルタイムで音声を変化させるEQのような処理をするのにはちょっと利用方法が違うな、とチュートリアルを通して感じました。

フィルターは、音声信号を型に入れて変化させるようなイメージ、FFTは、音声信号の成分を調べるイメージと考えています。

次に、デジタルフィルタの種類です。DSPには2種類のデジタルフィルタがあります。

FIR

FIRのイメージがとても分かりやすいのは次のサイトでした。

電子工作室(デジタルフィルタの概要)

こちらのサイトにもあるように、横軸に時間を取るようなデータで、過去のデータを平均すると、急激なデータ変動が平均化されてローパスフィルタになる、という説明はとても理解しやすかったです。

株価とかFXのチャートの移動平均線と同じだね~

IIR

IIRのフィルタは、自身の出力のフィードバックを取り入れるフィルタです。

IIRの中でも、双二次フィルタと呼ばれるものが実用的に音声のフィルタリングによく使われるようです。

うつぼかずらさんのデジタルフィルタの設計のページが非常にわかりやすく、おすすめです。

フィルタの設計は、高度な数学的知識が必要になります。音声信号をフィルタリングしたいという場合は、この双二次フィルタを使うところから始めるのが良いと思います。

また、JUCEでは、「juce::DSP::Coefficients::makeHighPass」などの対応したフィルタの関数で高度な数学的知識がなくても、カットオフ周波数とQ値を与えるだけでフィルタの係数を得ることができるので、とても便利です。

こちらの記事で、makeHighPass関数を利用したハイパスフィルタープラグインの実装をおこなっていますので、ご参照ください。

JUCEライブラリでは、DSPモジュールを使うことで、フィルタの作成がかなり簡略化されていますので、フィルタに与える係数の概念などを勉強することで、デジタルフィルタを音声処理に組み込むことができるようになります。

信号処理のライフサイクル

JUCEのDSPモジュールの処理サイクルに関する記載です。

JUCEアプリケーションのライフサイクルと同じように、DSPプロセッサを利用するときには、次の関数を実装する必要があります。

・prepare()関数:サンプルレートとバッファブロックサイズの設定を行います。

・process()関数:音声処理を行います。

・reset()関数:プロセッサの内部状態をリセット、スムージングをします。

を実装する必要があります。スムージングの意味はよく分かっていません^^;

プラグイン等の本体のクラス(の親のAudioProcessorクラス)には、音声処理を行うprepareToPlay、processBlock、reset関数がありますので、これに対応するように実行していくという点を抑えておく必要があります。

prpcessor Chainについて

何個かDSPモジュールのプロセッサを使う際、すべてのプロセッサについてprepare、process、resetを順番に定義しなければいけません。processorChainを使うことで、これをまとめてやってくれるようです。

juce::dsp::ProcessorChain<juce::dsp::Oscillator<Type>, juce::dsp::Gain<Type>> processorChain;

この場合は、DSPモジュールのオシレータを定義した後、DSPモジュールのゲインプロセッサを定義しています。オシレータプロセッサは、音の発振をして、ゲインプロセッサで音量の変更を行うという流れでしょう。これらのプロセッサをProcessorChainを利用してまとめることで、直列につないでいるのと同じようになるみたいです。ProcessorChainは、これからのチュートリアルの実装で利用してみて、どのように使っていくのかをよく見ていきたいと思います。

よかったらシェアしてね!
目次
閉じる