デシベル計算の高速化

前回記事でべき乗(pow)や対数(log)の演算は遅いということが分かりました。デジタルエフェクターではデシベル計算をよく使うため、これらの演算を高速化することを考えます。(以下、C言語を前提とした記述となっています。)



< dB x → 電圧比(倍率) y >

通常の計算は y = powf( 10.0f, x / 20.0f ) ですが、500サイクル程度かかります。そこでテーブル引きという方法を使います。あらかじめ表(ルックアップテーブル)を用意しておき、そこから値を取り出して計算する方法です。

今回テーブルは-128dB~+128dBの範囲で1dBステップとしました。小数点以下の部分については線形補間(2点間を一次関数に当てはめる)で近似します。コードは下記の通りです。dbtovolTable.hファイルはGitHubに置いています。

#include "dbtovolTable.h"

float dbtovol(float x)
{
x += 128.0f;
uint8_t xi = (uint8_t) x;
return dbtormsTable[xi] + (dbtormsTable[xi+1] - dbtormsTable[xi]) * (x - xi);
}

xiにはuint8_tの0~255が入るので、テーブル配列のサイズは257にすればよいです。もちろん入力値が範囲外の場合は正しい値が出力されません。誤差は最大0.015dBで、実用には充分だと思います。サイクル数は約30となり大幅に高速化できました。



< 電圧比(倍率) x → dB y >

通常の計算は y = 20.0f * log10f( x ) ですが、230サイクル程度かかります。こちらもテーブル引きを利用したいところですが、等比級数的なテーブルを準備する方法がわかりませんでした。膨大な量の配列を準備している例もありますが、メモリが少ない場合には無理があります。

今回はsqrtf演算(=1/2乗)が高速なことを利用することにしました。以下のように式を変形します。
log x
= log ( x1/2 )2
= 2 log x1/2
・・・
= 32 log x1/32
あとは x1/32 とdBの関係を三次関数で近似します。コードは以下の通りです。

#include <math.h>

float voltodb(float x)
{
x = sqrtf(sqrtf(sqrtf(sqrtf(sqrtf(x)))));
return - 559.57399f + 995.83468f * x
- 591.85129f * x * x + 155.60596f * x * x * x;
}

使用範囲は0.00001(-100dB)~1(0dB) 推奨、最大誤差0.016dBです。電圧比というより音量変換を見据えた範囲としています。範囲を超えると誤差が増えますが、極端に外れた値にはなりません。サイクル数は約90で、効果はそれなりでした。

他にもいろいろな方法を試したのですが、条件分岐を入れると意外とサイクル数が増えてしまう等、なかなかこれといった方法が見つかりませんでした。場合によっては通常のlog10fを使うことになりそうです。

Raspberry Pi でのCS4272使用方法

Raspberry Pi(RPi)で音声信号向けのADCとDACを使う場合、最も手軽に使用できるICはWM8731だと思います。今回はさらなるノイズ低減を期待して、CS4272というICを試しました。



CS4272を使ったオーディオカードにTeensy Super Audio Board(SAB)というものがあり、KiCAD files and some test codeから回路図や使用ガイド等がダウンロードできます。このSABのデバイスドライバを利用するわけですが、カーネルビルドというやや面倒な作業をしないとドライバを使えるようになりません。→「rpi-update」コマンドで簡単に利用できるようになったようです。(2018年5月21日追記)

RPi公式サイト記事Kernel buildingのLocal buildingの通りに操作を行っていきます。

[1]
$ sudo apt-get install git bc
↓SAB用のカーネルソースをコピー
$ git clone --depth=1 https://github.com/whollender/linux

[2a] RPi 1, 0 の場合
$ cd linux
$ KERNEL=kernel
$ make bcmrpi_defconfig
↓ビルド開始、RPi0で14時間程度かかる
$ make zImage modules dtbs

[2b] RPi 2, 3 の場合
$ cd linux
$ KERNEL=kernel7
$ make bcm2709_defconfig
↓ビルド開始、RPi3で3時間程度かかる
$ make -j4 zImage modules dtbs

[3]
$ sudo make modules_install
$ sudo cp arch/arm/boot/dts/*.dtb /boot/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
$ sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

そして再起動すると/boot/overlaysディレクトリにsuperaudioboard.dtboというファイルができています。続いて/boot/config.txtを編集します。
$ sudo nano /boot/config.txt
 以下の2行の#を外す
  #dtparam=i2c_arm=on
  #dtparam=i2s=on
 最後に以下の1行を追加
  dtoverlay=superaudioboard

再起動後、lsmodコマンドでSABドライバのモジュールが確認できる…はずですが、読み込まれていないことがわかります。モジュール情報をmodinfoコマンドで確認するとvermagic:4.9.59+という記載が出てきますが、ビルドしたカーネルのバージョン(リリース番号)をuname -r コマンドで確認すると4.9.80+となっています。強制的にモジュールを読み込ませようとしてみます。
$ sudo modprobe -f snd-soc-superaudioboard
Exec format errorというのが出てきてダメでした。

バージョン情報を編集して再ビルドするという方法を行います。参考ページ→Linux 4 Tegraにv4l2loopbackモジュールを入れる時の注意点
$ sudo nano linux/include/generated/utsrelease.h
#define UTS_RELEASE "4.9.80+"という記載があるので、4.9.80+を4.9.59+(RPi 2, 3の場合は4.9.80-v7+→4.9.59-v7+)へ変更した後、もう一度[2a](または[2b])と[3]をやり直し再起動します。一度ビルドしているので早く終わります(未確認ですが、RPi3で1時間未満)。
※後から確認すると、再ビルド後のバージョンは4.9.80+でした。どこか記憶違いをしている部分があるかもしれません。



RPiとCS4272との接続は下図です。SABと同じように24.576MHzの水晶発振子と39pFのコンデンサを使います。
22_216_1cs.png

aplay -l コマンドでサウンドカードの確認ができます。接続が正しければ、CS4272がSABとして認識されているはずです。音量等の調節はalsamixerコマンドでできます(hキーでヘルプ表示)。今後特に問題が出てこなければ、自作デジタルエフェクターRasPd3に採用する予定です。→FILT+とVCOMピンが0Vになるという問題が解決できず、ボツになりました。(2018年5月7日追記)

タグ : RaspberryPi 

Raspberry Pi zero 設定メモ

SSH接続とファイル操作ができるようになるまでの自分用設定メモです(太字表記はコマンド)。
Raspberry Pi 3, Raspberry Pi zero W の設定メモはこちら
※Raspberry PiやRaspbianの仕様変更によりうまくいかなくなる可能性があります。



Raspbian Stretch Liteダウンロード、Win32 Disk ImagerでmicroSDカードに書き込み
/boot/ ディレクトリに ssh という名前のファイルを置いておく



データ通信できるmicroUSBケーブルをPCと接続するだけで通信可能(OTGモード)
WindowsからTera Termで raspberrypi.local にSSH接続
参考ページ→ノートパソコンだけで raspberry pi zero をセットアップする方法

<インターネット接続>
参考ページ→SSH接続で raspberry pi zero の設定を行う1(インターネットに接続する)

<IPアドレス固定>
$ ifconfig (usb0 の inet addr: を確認)
$ sudo nano /etc/dhcpcd.conf
以下を追記(割り当てられたアドレスが192.168.137.99の場合)
interface usb0
static ip_address=192.168.137.99
static routers=192.168.137.1
static domain_name_servers=192.168.137.1

再起動後、WindowsからTera Termで固定したIPアドレスにSSH接続



<アップデート>
$ sudo apt-get update
$ sudo apt-get upgrade

<初期設定>
$ sudo raspi-config
Change User Password
Boot Options > Desktop / CLI > Console Autologin
Localisation Options > Change Timezone > asia > tokyo
※Pure Dataと相性が悪そうなので日本語表示しない

<ルートパスワード変更>
$ sudo passwd root

<Samba設定>
$ sudo apt-get install samba
$ sudo nano /etc/samba/smb.conf
Samba設定参考サイト→ツール・ラボ » 第14回 Raspberry Piのファイルサーバ設定をする
※プログラムが実行可能なように、ファイルのパーミッションも0775にしておく
Sambaのユーザ登録
$ sudo smbpasswd -a pi

Windowsのエクスプローラーのアドレスに\\raspberrypi\piを入力、ユーザー名・パスワードを入れアクセス

タグ : RaspberryPi 

Raspberry Pi 3, Raspberry Pi zero W 設定メモ

SSH接続とファイル操作ができるようになるまでの自分用設定メモです(太字表記はコマンド)。
Raspberry Pi zero の設定メモはこちら
※Raspberry PiやRaspbianの仕様変更によりうまくいかなくなる可能性があります。最終更新:2018年2月1日



Raspbian Stretch Liteダウンロード、Win32 Disk ImagerでmicroSDカードに書き込み
/boot/ ディレクトリに ssh という名前のファイルと、以下の内容の wpa_supplicant.conf という無線LAN設定ファイルを置いておく
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="SSID"
psk="password"
}

起動後、WindowsからTera Termで raspberrypi.local にSSH接続(ユーザー名 pi パスワード raspberry)

無線LANのパスワードをわかりにくくする場合、以下の操作をしておく
$ sudo bash -c 'wpa_passphrase "SSID" "password" >> /etc/wpa_supplicant/wpa_supplicant.conf'
$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
すでに記載がある「network={…}」や「#psk="password"」を消去

<IPアドレス固定>
$ sudo nano /etc/dhcpcd.conf
以下を追記(ルーターのアドレスが192.168.10.1の場合)
interface wlan0
static ip_address=192.168.10.99/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

再起動後、WindowsからTera Termで固定したIPアドレスにSSH接続
※コピー・ペーストはAltキー
※キーボードの↑↓キーで前に使ったコマンドを呼び出せて便利
自動ログイン参考サイト→自動ログインする方法



<アップデート>
$ sudo apt-get update
$ sudo apt-get upgrade

<初期設定>
$ sudo raspi-config
Change User Password
Boot Options > Desktop / CLI > Console Autologin
Localisation Options > Change Timezone > asia > tokyo
※Pure Dataと相性が悪そうなので日本語表示しない

<ルートパスワード変更>
$ sudo passwd root

<Samba設定>
$ sudo apt-get install samba
$ sudo nano /etc/samba/smb.conf
Samba設定参考サイト→ツール・ラボ » 第14回 Raspberry Piのファイルサーバ設定をする
※プログラムが実行可能なように、ファイルのパーミッションも0775にしておく
Sambaのユーザ登録
$ sudo smbpasswd -a pi

Windowsのエクスプローラーのアドレスに\\raspberrypi\piを入力、ユーザー名・パスワードを入れアクセス

タグ : RaspberryPi 

DIY Layout Creator 3.x 非公式日本語簡易マニュアル

誠に勝手ながら、DIY Layout Creator 3.xの簡易マニュアルを記載させていただきます。
この記事を書いている時点の最新バージョンは3.31.0です。

もっと詳しい英語マニュアルはこちら



【導入方法】
https://java.com/からJAVAをダウンロード、インストール(ソフトを動かすために必要)

サイトDIY FeverDIY Layout CreatorDownload Pageから最新バージョンのzipファイル(diylc-3.31.0.zip)をダウンロードし、CドライブProgram Filesフォルダ等に解凍
※どのフォルダでもいいですが、フォルダ名に日本語があると起動しない場合があります。

(Windowsの場合)解凍したフォルダ内のdiylc.exeを実行
(Linux、Unix、Macの場合)ターミナルを起動し、「cd <解凍したフォルダのパス>」を入力後「./run.sh」を入力
※起動時にテンプレート呼出画面が出てきますが、×で閉じてOKです。



【操作方法】
例として抵抗を配置します。
(1)Passiveタブを選択 (2)Resistorをクリック (3)配置したい位置2箇所をクリック
※配置するときに1箇所クリックだけでよい部品もあります。
20_158_1DLC01.png

配置後すぐ(またはダブルクリックで)編集ダイアログが表示されます。Alpha(透過度)・色・抵抗値や大きさ等を編集できます。右側の四角にチェックを入れるとその部品のデフォルトの値として保存できます。
20_158_2DLC02.png

右クリックでコピーや回転もできます。Save as Templateで、部品テンプレートとして名前をつけて保存できます。部品テンプレートは右クリックメニュー内のApply Templateで適用するか、ツールボックスの部品画像横の▼から呼び出せます。
20_158_3DLC03.png

部品を移動するときは部品本体をドラッグします。部品を選択した状態で緑色になっている点はその点単独で動かすことができます。
20_158_4DLC04.png



【Configの内容】
・Anti-Aliasing: 画像のギザギザがきれいになりますが、ソフトの動作は遅くなります。
・Auto-Create Pads: 部品を配置したときに、ソルダーパッド(丸い円)が自動的に追加されます。
・Auto-Edit Mode: 部品を配置したときに、部品編集ダイアログがすぐに表示されます。
・Continuous Creation: 同じ部品を連続して配置します。
・Export Grid: 印刷や画像出力の際、グリッド線も出力します。
・Hi-Quality Rendering: 画質が上がりますが、ソフトの動作は遅くなります。
・Mouse Wheel Zoom: マウスホイールで拡大縮小できます。
・Outline Mode: 抵抗・コンデンサ等のパーツのみが透過されます。
・Snap to Grid: 部品がグリッドに合わせて配置されます。
・Sticky Points: 移動時に部品同士がくっついた状態になります。※この機能は、Ctrlキーを押している間有効と無効が切り替わります。
・Theme: 画面色を変更できます。



【その他の機能】
・マウスで範囲選択すると部品を複数選択できるので、まとめて移動や回転ができます。
・Fileメニューから各種画像・pdf・部品リスト出力や印刷等ができます。
・ステータスバー左に現在の選択状態等が表示されます。
・表示倍率を右下のZoom:で変更できます。
・解凍したフォルダ内のtemplatesフォルダにdiyファイルを保存しておくと、起動時に呼び出すことができます。私は下図のようなファイルを作っています。
20_158_5DLC05.png

タグ : DIY_Layout_Creator 

管理人

管理人

自己紹介のページ
記事一覧
Twitter
GitHub

ブログ内検索
カテゴリー
タグ

自作エフェクター   レイアウト   回路図   歪み   PureData   周波数特性   マイコン   波形・倍音   RaspberryPi   エレキギター   アンプ   エレキベース   エフェクター自作方法   歪率   真空管   コーラス   ピックアップ   静音ギター   ヘッドフォンアンプ   擬似ギター出力   市販エフェクター   アコースティックギター   ブースター   コンデンサ   ソロギター   ポールピース   イコライザー   コンプレッサー   ビブラート   フェイザー   トレモロ   TAB譜   ディレイ   DIY_Layout_Creator   ワウ   オートワウ   バッファー   

最近の記事
最新コメント
Twitter
RSS
メールフォーム
当ブログに関するお問い合わせはこちらからお願いします。 ※FAQ(よくある質問)もお読みください。

お名前
メールアドレス
件名
本文

アクセスカウンター