Smile Engineering blog ( スマイルエンジニアリング・ブログ )

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

デジタル信号処理とは「Audacityでフィルタ編」

2018-11-08 15:30:00 | JSP-knowledge

デジタル信号処理という用語をご存知でしょうか。今までデジタルオーディオに関して書いてきましたが、この辺でデジタル信号処理についても少し話をしたいと思います。

デジタル信号処理

デジタル信号処理とは、その名の通りデジタル化された信号を処理(加工)する技術ですが、今や専門用語ではなくなりつつあると感じます。デジタル信号処理を専門に行うプロセッサーで、DSP(Digital Signal Processor)というものをご存知でしょうか。。。信号処理はもちろんアナログ回路でも出来ますが、半導体の進化によりDSPなどが普及し、低コストでデジタル信号処理が可能な時代になりました。

アナログ信号をデジタル変換した後、デジタル信号処理を行い、またアナログ信号に戻すようなプロセスをリアルタイムで行えるようになってきました。

Audacity3-AD-DA-100.jpg

10年ほど前では、高品質を求めると、ハイスペックで高価なプロセッサーが必要だったり、処理時間や遅延が問題になり、リアルタイムではアナログ信号に比べ、その差を感じてしまうケースが多々ありました。

近年では何と言ってもスマホの影響でその需要が高まり、私生活でも仕事でも関わらない日は無いと思います。

 

デジタル信号処理の応用例

分野応用例(特にアナログ ↔ デジタル変換に関わるもの)
画像処理 デジタルカメラ、デジタルビデオ
映像動画 地上波デジタル放送、ネット動画配信
音声符号化 音声通信、携帯電話
音声認識 音声ナビ、AIスピーカ、ロボット工学
音響技術 エコーキャンセラ、ノイズキャンセラ、マイクロホンアレー

※スマホは、ほぼ全部に関連しますね。。。

私は、音声や音響の分野で信号処理に携わり、過去は音声符号化を中心にやっていました。最近は音響の方を中心にやっています。今回は、Audacityを通じて、音響信号処理の代表的なアルゴリズムについて紹介したいと思います。
何といっても、フィルタとFFTだと思います。

  • デジタルフィルタ
  • FFT(高速フーリエ変換)

学問的には基礎的で教科書に書かれているものだったと思いますが、仕事で実戦となると奥が深く製品の品質に直結するコアの技術と感じます。私はまじめに勉強してなかったので、実戦のみで奮闘していますが、有識者に質問すると数学で説明してくれるので、分かったフリはしますが、ん~って感じです。

これらの技術は、Audacityでも使われています。今回はデジタルフィルタを数学抜きに少し紹介したいと思います。

デジタルフィルタ

信号処理のフィルタとは、信号から特定の成分を取り出したり、または除去したりすることです。デジタルフィルタとは、アナログ➞デジタル変換された信号を、デジタルでフィルタ処理することです。Audacityで簡単なフィルタ処理をしてみます。

Audacityでスイープトーンを生成してフィルタリングしてみる

【ジェネレータ】→【チャープ】
まずは、フィルタリングを行う信号を生成してみます。今回はスイープトーン(Sweep tone)を使用してみました。スイープトーンとは、連続的に周波数を変化させた信号の事です。Audacityでは、【ジェネレータ】→【チャープ】で生成できます(サンプリング周波数は48kHz)。

波形サイン波備考
周波数(Hz): 開始:1000 ~ 終了:20000 今回は、1000Hz~20000Hz にしてみます
振幅(0-1): 開始: 0.5 ~ 終了: 0.5 0.0~1.0を指定、信号の振幅です
補完: リニア  

 

時間軸の波形:Sweep tone

サイン波の周期が時間と共に短く(周波数が高く)なって行きますが、この表示ではちょっと分かりにくいです。
Audacity3-100.jpg

カーソルを波形の上に置き、Ctrl+スクロールで波形が拡大されます。この表示も分かりにくいですが、表示の範囲を右にずらして行くと周期が短く(周波数が高く)なるのが分かります。
Audacity3-110.jpg

 

スペクトログラム:Sweep tone

【ファイル名】➞【 スペクトログラム】(表示波形のファイル名のところを、プルダウン)

<var id="internallink-24" class="internallink">#24</var> (Audactyで周波数分析)
スペクトログラムを選択すると、縦軸が周波数、横軸が時間で、周波数成分のレベルは色で表されます。この表示では時間と共に周波数が高くなって行くことが分かると思います。1kHz~20kHzに変化していきます。興味のある方は聞いてみて下さい(言葉で表すなら、ピーという音がどんどん高くなって行きます)。
皆さんは何Hzまで聞き取れるでしょうか。。。 ヘッドフォンで聞く場合は音量に注意して下さい。
Audacity3-120.jpg

 

スペクトラム表示:Sweep tone

【解析】➞【 スペクトラム表示】(リニア周波数軸)

<var id="internallink-24" class="internallink">#24</var> (Audactyで周波数分析)
1000Hz~20000Hzの周波数成分が分かると思います。
Audacity3-140.jpg

AudacityでHigh Pass Filter(高域通過フィルタ)

【エフェクト】→【High Pass Filter】
生成したスイープトーンに、ハイパスフィルタをかけてみます。

High Pass Filter設定備考
Frequency (Hz): 10000.0 20000Hzの半分の10000Hzにしてみました
Rolloff (dB per octave): 48 dB 違いがはっきり分かるように大きい減衰量を指定

 

スペクトログラム:Sweep tone→High Pass Filter

低い周波数が消えています。
Audacity3-200.jpg

 

時間軸の波形:Sweep tone→High Pass Filter

【ファイル名】➞【波形】(表示波形のファイル名のところを、プルダウン)
こちらの波形でも、低い周波数が消えているのが分かります(振幅が小さくなります)。
Audacity3-210.jpg

 

スペクトラム表示:Sweep tone→High Pass Filter

【解析】➞【 スペクトラム表示】(リニア周波数軸)
High Pass Filterで指定した10000Hzを境に低域が減衰していることが分かります。
Audacity3-220.jpg

Audacityでホワイトノイズを生成してフィルタ特性を調べる

【ジェネレータ】→【ノイズ】
フィルタの特性を見るには、ホワイトノイズ(White noise)という全ての周波数成分が同じ強度で含まれる雑音を使用すると良く分かります(言葉で表すなら、サーッとした音です)。

ノイズ設定備考
ノイズの種類: ホワイト 乱数によって生成できます
振幅(0-1): 0.5 0.0~1.0を指定、信号の振幅です

 

スペクトラム表示:White noise

【解析】➞【 スペクトラム表示】(リニア周波数軸)
全ての周波数成分があることが分かります。
Audacity3-300.jpg

 

High Pass Filter(高域通過フィルタ)

【エフェクト】→【High Pass Filter】
スイープトーンの時と同じHigh Pass Filterを実行します。

スペクトラム表示

【解析】➞【 スペクトラム表示】(リニア周波数軸)
High Pass Filterで指定した10000Hzを境に、フィルタの特性が分かります。
Audacity3-310.jpg

Low Pass Filter(低域通過フィルタ)

【エフェクト】→【Low Pass Filter】
逆にローパスフィルタでは次の特性です。10000Hzを境に、高域が減衰される特性が分かります。
Audacity3-320.jpg

FFT(高速フーリエ変換)

ここで紹介したスペクトラム表示とは、FFTを使用して時間領域の信号から周波数領域へ変換を行い、周波数成分の解析を行ったものです。

 


moniswitch
  今お使いの離床センサーがそのまま使える!
  離床センサーのスイッチ入れ忘れ事故を防止するスマートスイッチ 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

音声合成ライブラリ OpenJTalk セットアップ手順

2018-11-08 15:30:00 | JSP-knowledge

about

音声合成ソフト「OpenJTalk」のセットアップ手順メモ。
最後に記載する参考リンク先の通り、ディストリビューションを気にせず、かつ最新版をインストールするためにソースコードからコンパイル・インストールする。

検証環境

  • Ubuntu 16.04 LTS 64bit
  • Ubuntu 18.04 LTS 64bit

目次

  1. インストール準備
  2. HTS engine APIインストール
  3. OpenJTalkインストール
  4. 音声のインストール
  5. 音声合成スクリプトの作成

1. インストール準備

$ sudo apt update 
$ sudo apt install gcc g++ make unzip 
$ mkdir ~/openjtalk 

2. HTS engine APIインストール

最新バージョンをチェックして実行すること。
http://sourceforge.net/projects/hts-engine/files/hts_engine API/

$ cd ~/openjtalk 
$ wget "https://downloads.sourceforge.net/project/hts-engine/hts_engine%20API/hts_engine_API-1.10/hts_engine_API-1.10.tar.gz" -O hts_engine_API-1.10.tar.gz 
$ tar zxvf hts_engine_API-1.10.tar.gz 
$ cd hts_engine_API-1.10/ 
$ ./configure 
$ make 
$ sudo make install 
$ which hts_engine 

3. OpenJTalkインストール

最新バージョンをチェックして実行すること。
http://sourceforge.net/projects/open-jtalk/files/Open JTalk/

$ cd ~/openjtalk 
$ wget "https://downloads.sourceforge.net/project/open-jtalk/Open%20JTalk/open_jtalk-1.10/open_jtalk-1.10.tar.gz" -O open_jtalk-1.10.tar.gz 
$ tar zxvf open_jtalk-1.10.tar.gz 
$ cd open_jtalk-1.10/ 
$ ./configure --with-hts-engine-header-path=/usr/local/include --with-hts-engine-library-path=/usr/local/lib --with-charset=UTF-8 
$ make 
$ sudo make install 
$ which open_jtalk 

4. 音声のインストール

最新バージョンをチェックして実行すること。
http://sourceforge.net/projects/open-jtalk/files/HTS voice/
http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/

$ cd ~/openjtalk 
$ wget "https://downloads.sourceforge.net/project/open-jtalk/HTS%20voice/hts_voice_nitech_jp_atr503_m001-1.05/hts_voice_nitech_jp_atr503_m001-1.05.tar.gz" -O hts_voice_nitech_jp_atr503_m001-1.05.tar.gz 
$ tar zxvf hts_voice_nitech_jp_atr503_m001-1.05.tar.gz 
$ wget "https://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip" -O MMDAgent_Example-1.7.zip 
$ unzip MMDAgent_Example-1.7.zip 
$ sudo mkdir /usr/share/hts-voice 
$ sudo chown username:username /usr/share/hts-voice 
$ cp hts_voice_nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice /usr/share/hts-voice/ 
$ cp MMDAgent_Example-1.7/Voice/mei/*.htsvoice /usr/share/hts-voice/ 
$ cp MMDAgent_Example-1.7/Voice/slt/cmu_us_arctic_slt.htsvoice /usr/share/hts-voice/ 

5. 音声合成スクリプトの作成

$ sudo mkdir /usr/share/open_jtalk 
$ sudo chown username:username /usr/share/open_jtalk 
$ cat << EOS > /usr/share/open_jtalk/say.sh
#!/bin/bash 
 
 
FILE=/tmp/\`date +%s%N\`.wav
VOICE=/usr/share/hts-voice/mei_normal.htsvoice
 
 echo "\$*" | open_jtalk \\
 -m \$VOICE \\
 -x /usr/local/dic \\
 -s 48000 \\
 -p 240 \\
 -a 0.55 \\
 -jm 0.7 \\
 -jf 0.5 \\
 -ow \$FILE
 
 
cat \$FILE
rm -rf \$FILE EOS 
$ chmod 755 /usr/share/open_jtalk/say.sh 
$ /usr/share/open_jtalk/say.sh 音声合成テスト > out.wav # 検証環境では167KBのファイルが生成された 
$ aplay out.wav # スピーカーがあれば再生される…と思う 

 

参考リンク

http://server-setting.info/centos/open-jtalk-install.html

 

moniswitch
  今お使いの離床センサーがそのまま使える!
  離床センサーのスイッチ入れ忘れ事故を防止するスマートスイッチ 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

Ubuntu 18.10 備忘録

2018-10-30 09:15:00 | JSP-knowledge

はじめに

Ubuntu 18.10(Cosmic Cuttlefish)がリリースされました。インストール直後の設定や躓いたポイントなど備忘のために残しておきます。

備忘録

不完全な言語サポートの修正

Proxy 環境下では GUI の言語サポートがうまく機能しません。GUI の Network で設定した Proxy 設定が効かず、パッケージをインストール(ダウンロード)できないようです。そんなときは CUI で済ましてしまいます。 check-language-support コマンドで不足しているパッケージをリストできるのでこれを利用します。

$ sudo -E apt install $(check-language-support) 

Papirus アイコン

18.04 で導入された「Yaru」テーマも悪くありませんが、個人的には抜けの良い Papirus アイコンが好きなので変更します。

$ sudo add-apt-repository ppa:papirus/papirus $ sudo apt-get update $ sudo apt-get install papirus-icon-theme 

Papirus icon theme for Linux

アイコン(テーマ)の変更は gnome-tweaks を使いました。以下のコマンドで 2 つのパッケージをインストール後、いったんログアウトします。

$ sudo apt install gnome-tweak-tool $ sudo apt install gnome-shell-extensions 

ログイン後、gnome-tweaks を起動し、

  • Extensions

    • User themes -> ON
  • Appearance

    • Themes
      • Icons -> Papirus

とします。Dock のアイコンサイズは 22 が良いなー。

open-vm-tools

VM 上で利用するときは open-vm-tools をインストールします。ホストとクリップボードの同期ができたり、ファイルのコピー&ペーストができたりして便利です。

$ sudo apt install open-vm-tools open-vm-tools-desktop 

さらに open-vm-tools にはホストのウィンドウにフィットするようにゲストの解像度が自動的に調整される機能があるのですが、18.10 ではうまく動かないことがあります。そんなときは open-vm-tools のサービスを再スタートすると直ります。

$ sudo systemctl restart open-vm-tools.service 

Docker

cosmic(18.10)のリポジトリは存在しません。bionic(18.04)のリポジトリからインストールして hello-world までは確認できました。LTS のリポジトリしか提供されないの?

$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ bionic \ stable" 

Get Docker CE for Ubuntu

Visual Studio Code

オフィシャルの手順どおりでインストールできます。「Markdown Preview Github Styling」と呼ばれる Extension は忘れずに入れます。Markdown プレビューの見た目が GitHub 風になります。

Visual Studio Code on Linux

カーネル情報

ubuntu-18.10-desktop-amd64 インストール直後のカーネルバージョンです。

$ uname -rv 4.18.0-10-generic #11-Ubuntu SMP Thu Oct 1115:13:55 UTC 2018 $ cat /proc/version_signature Ubuntu 4.18.0-10.11-generic 4.18.12 

さいごに

なにか気づいたら適宜追記します。


moniswitch
  今お使いの離床センサーがそのまま使える!
  離床センサーのスイッチ入れ忘れ事故を防止するスマートスイッチ 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

データ分析手法(アソシエーション分析

2018-10-30 09:15:00 | JSP-knowledge

アソシエーション分析

アソシエーション分析とは、膨大なデータから意味のある関連性(アソシエーションルール)を抽出する分析手法です。
ECサイトやPOSの取引データから「商品Aを買うと、商品Bも買う確率が高い」というようなルールを見つけ出す方法になります。

評価指標

アソシエーションの強さは以下の3つの値で評価します。
・支持度(Support)
・信頼度(Confidence)
・リフト値(Lift)

「架空の購入データ」

購入明細ID購入商品
1 弁当、バナナ、たばこ
2 パン、コーヒー、チョコレート
3 弁当、ビール、たばこ
4 雑誌、コーヒー、チョコレート
5 ビール、たばこ、コーヒー
 

⇒アソシエーションルールに変換

条件部(A) 結論部(B)支持度信頼度リフト値
弁当 たばこ 0.55 0.63 1.21
コーヒー チョコレート 0.50 0.55 1.32
ビール たばこ 0.49 0.50 1.45
         

A・Bを事象として「Aという条件の時にBが起こる」を、「A⇒B」と表します。
(Aを条件部、Bを結論部という)

1.支持度
支持度(A⇒B) = 条件部(A)と結論部(B)をともに含むデータ数 ÷ 全データ数

全データの中で、「商品Aを購入するときに、商品Bも一緒に購入する」というルールが出現する割合です。
この指標が高いほど、全体の中でそのルールが出現する割合が高くなります。

2.信頼度
信頼度(A⇒B) = 条件部(A)と結論部(B)をともに含むデータ数 ÷ 条件部(A)を含むデータ数

条件部(A)の項目が出現する割合の中で、条件部(A)と結論部(B)が同時に出現する割合です。
この指標が高いほど、AとBの商品は関連が強いということになります。

3.リフト値
リフト値 = 確信度(A⇒B) ÷ 結論部(B)を含むデータ数

条件部(A)と一緒に結論部(B)を購入した顧客の割合が、全データの中で結論部(B)を購入した顧客の割合よりどのくらい多いかを示したものです。
この指標が低いほど、Bの商品は単独でよく売れているということになります。

 

 moniswitch
  今お使いの離床センサーがそのまま使える!
  離床センサーのスイッチ入れ忘れ事故を防止するスマートスイッチ 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

Audactyで周波数分析

2018-10-04 10:00:00 | JSP-knowledge

 

前回「Audacity」を紹介しましたが、周波数の波形表示を使ってみました。

 

Audacity

https://www.audacityteam.org/

Audacityの周波数の波形表示には2つの方法があります。
Audacity2-100.jpg

【ファイル名】メニューから【 スペクトログラム】、もう一つは、【解析】➞【 スペクトラム表示】です。

時間軸の波形

デフォルトでは時間軸の波形です。
Audacity2-120.jpg

スペクトログラム

【ファイル名】➞【 スペクトログラム】
表示波形のファイル名のところを、プルダウンするとメニューが出てきます。スペクトログラムを選択すると、縦軸が周波数、横軸が時間で、周波数成分のレベルは色で表されます。「Audacity」では、青→赤→白の順にレベルが上がっています。時間軸の波形(上の図の波形)で4.5秒~6.5秒くらいで振幅が大きい(信号のレベルが大きい)部分がありますが、次の波形で見ると、約1kHzまでの低域が白く表示されています。この区間の信号の周波数成分は1kHz以下に集中していることが分かります。

Audacity2-200.jpg

スペクトラム

【解析】➞【 スペクトラム表示】
次の波形は、信号の大きい4.5秒~6.5秒くらいの範囲を選択したものです。

対数周波数軸

前の図の波形のスペクトログラムで白くなっている0Hz~1kHz位のレベルが高く、特に600Hz, 880Hz付近が大きいことが分かります。また、スペクトログラムで赤くなっている3kHz付近も少しレベルがあることが分かります。

Audacity2-300.jpg

リニア周波数軸

こちらでも、0Hz~1kHz(特に600Hz, 880Hz), そのあとの3kHz付近のレベル高い特性が分かります。

Audacity2-320.jpg

「サイズ」とは周波数解析するフレームサイズで、FFT(高速フーリエ変換)のサイズ(サンプル数)です。一般的には2のべき乗だと都合が良いので、512とか1024とか大きい方が品質が良くなります。PCのスペックが低く時間がかかる場合は小さくすると品質は下がりますが早くなります。
48kHzの場合、サイズ=1024サンプルとは約21msになります。

  • 1/48000(Hz) × 1024 = 0.21(ms)

「軸」は、横軸のサンプリング周波数です。例えば48kHzの場合0~24kHzになります。表現できる周波数はサンプリング周波数の半分です(サンプリング定理)。対数とリニアは表示方法なのでどちらでも。

  • <var id="internallink-13" class="internallink">#13</var> サンプリング周波数とビットレート

「関数」とは窓関数のことです。参考(https://ja.wikipedia.org/wiki/%E7%AA%93%E9%96%A2%E6%95%B0)

スペクトラム表示設定説明
アルゴリズム: スペクトラム表示 周波数成分の表示
関数: Hanningウィンドウ 窓関数
サイズ: 128~65,536(※) FFTのサイズ
軸: 対数周波数軸 or リニア周波数軸 表示方法なのでどちらでも

(※)「Audacity」では、最大65,553まであり、大きい方が精度が高いです。

トーン信号の生成

【ジェネレーター】➞【 トーン】
信号を生成する場合は、ジェネレーターです。今回はトーン信号を生成してみました。
サイン波で周波数は適当に1000(Hz)です。

トーン設定説明
波形: サイン波 波形の種類
周波数(Hz): 1000 とりあえず1kHz
振幅(0-1): 0.8 0~1.0の値で、今回はデフォルトのままです。

カーソルを波形の上に置き、Ctrl+スクロールで波形が拡大されます。
Audacity2-410.jpg

これを、スペクトラム表示すると、1000Hzのところのとんがっているのが分かります。

Audacity2-420.jpg

 

moniswitch
  今お使いの離床センサーがそのまま使える!
  離床センサーのスイッチ入れ忘れ事故を防止するスマートスイッチ 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント