2014年5月27日火曜日

DDSのフェイズアキュムレーターのbit長の検証

ピュンピュン2号はArduinoでDDSで波形を生成している。


↓動画
https://www.youtube.com/watch?v=nUqrsvC5NPo

DDSというのはソフトシンセで言うとWave Table方式のオシレーターの一種だ(と思う)
詳しいことはNational Instrumentsのドキュメントがわかりやすかった
http://www.ni.com/white-paper/5516/ja/

ピュンピュン2号はAVRで作ったシンセを公開してくださってるサイトをいろいろ参考にして
ソースを切り貼りしながら試行錯誤してプログラムを組んだのでかなり行き当たりばったりだ。

先人に習ってDDSのフェイズアキュムレーターは32bitで実装した。

でも16bitと32bitで、どれぐらい違いがあるのか調べてみたくなった。

Arduinoは16bitのCPUで、16bitまでの演算は掛け算も2クロックぐらいで済む。
逆に言うと32bit演算とか浮動小数点演算は極端に重くなる。

Arduinoで組んでもいいんだが、別にリアルタイムでやる必要もないので
普通のCで検証してみた。

32bitアキュムレーター

// DDSTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <io.h>
#include <fcntl.h>

#define _USE_MATH_DEFINES
#include <math.h>

/*********************************************************
phaseRegister   : 32bit
tunigWord       : 32bit
lookupTable     :  8bit
**********************************************************/

#define SAMPLE_CLOCK 44100 // 44.1kHz
#define TABLE_SIZE    0x100   // Lookup Table Size

uint32_t phaseRegister;
uint32_t tuningWord;
int16_t waveValue;
uint8_t *lookupTable;

double frequency = 440.0;  // 440Hz
int period = 1323000;      // 10s

int _tmain(int argc, _TCHAR* argv[])
{
_setmode(_fileno(stdout), _O_BINARY);

// Lookup Table の作成
lookupTable = (uint8_t*)malloc(TABLE_SIZE);
for (int i = 0; i < TABLE_SIZE; i++) {
lookupTable[i] = (sin(2.0 * M_PI * i / TABLE_SIZE) / 2 + 0.5) * 0xFF;
}
tuningWord = frequency * pow(2.0, 32) / SAMPLE_CLOCK;

phaseRegister = 0x00000000; 
for (int i = 0; i < period; i++) {
int index;

phaseRegister += tuningWord;
index = phaseRegister >> 24;
waveValue = (lookupTable[index] << 8) - 0x8000;

// printf("%d\n", waveValue);

// 16bit長の raw データとして出力
fwrite(&waveValue, sizeof(waveValue), 1, stdout);
}

free(lookupTable);

return 0;
}


16bitアキュムレーター

// DDSTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <io.h>
#include <fcntl.h>

#define _USE_MATH_DEFINES
#include <math.h>

/*********************************************************
phaseRegister   : 16bit
tunigWord       : 16bit
lookupTable     :  8bit
**********************************************************/

#define SAMPLE_CLOCK 44100 // 44.1kHz
#define TABLE_SIZE    0x100   // Lookup Table Size

uint16_t phaseRegister;
uint16_t tuningWord;
int16_t waveValue;
uint8_t *lookupTable;

double frequency = 440.0;  // 440Hz
int period = 1323000;       // 30s

int _tmain(int argc, _TCHAR* argv[])
{
_setmode(_fileno(stdout), _O_BINARY);

// Lookup Table の作成
lookupTable = (uint8_t*)malloc(TABLE_SIZE);
for (int i = 0; i < TABLE_SIZE; i++) {
lookupTable[i] = (sin(2.0 * M_PI * i / TABLE_SIZE) / 2 + 0.5) * 0xFF;
}

tuningWord = frequency * pow(2.0, 16) / SAMPLE_CLOCK;

phaseRegister = 0x0000;
for (int i = 0; i < period; i++) {
int index;

phaseRegister += tuningWord;
index = phaseRegister >> 8;
waveValue = (lookupTable[index] << 8) - 0x8000;

//printf("%d\n", waveValue);

// 16bit長の raw データとして出力
fwrite(&waveValue, sizeof(waveValue), 1, stdout);
}

free(lookupTable);

return 0;
}


rawデータで出力して、SOX (http://sox.sourceforge.net/)でwavに変換して
WaveSpectra(http://www.ne.jp/asahi/fa/efu/soft/ws/ws.html)でFFTして比較した。

(16bit)

(32bit)


ほとんど差がない。

静止画ではわからないが、16bitの方は-80dB以下のノイズが振動している。

が、音源としてはどっちでも一緒な気がする。


音源は、正弦波ではなくてめちゃくちゃな波形を出力した時にどういう聞こえ方をするのかが
大事なんである。

ピュンピュン2号のArduinoでは処理速度が追いつかなくなったので
次は32bitのARMベースにしようかと思っていたが
16Bit処理に抑えられればまだまだいける気がします

一応、rawデータのバイナリを直接比較したが2,584KB中61バイト違うだけだった。


2014年5月24日土曜日

LCRメーター DE-5000

電子工作の師匠に勧めてもらってたLCRメーターを秋月で購入して
しばらく遊んでいた。



ヘッドホンアンプ(A47)を作るときに入力のACカップリングに入れた
フィルムコンデンサがめちゃくちゃでかくて
ケースに収めるのに苦労したので
もっと小さくて、あんまり高くないやつを探したら
めちゃくちゃ大きさが違った。



これ、ほんとに同じ1uFのフィルムコンデンサなの?
と思ってほんとの容量が知りたくて購入したのだった。

緑のでかいのは
メタライズドポリプロピレンフィルムコンデンサ/ルビコン @80円(秋月)

グレーのちっちゃいのは
プラスチックフィルムコンデンサ(詳細スペック不明) @77円(マルツ)

で購入した。

測定結果




なんと1uFぴったり!
δも0!



ESRも0!


グレー



誤差 (1006.5 - 1000) / 1000 = 0.65 (%)
δ 0.003



ESR 0.62

δとかQとかθとかよくわからないんだが
リアクタンスとレジスタンスの配分の具合で
リアクタンス成分が多ければ純粋コンデンサに近くて
この3つは基本的に一緒の値

なので、スペック的には緑の圧勝という結果になった。

逆に秋月の陰謀ではないかと思うレベルであるが、
電解コンデンサだと2桁ぐらい弱い。



リード線が下に出てる部品ならスリット状のところにぶっさせばいいんだが
真横に出てる部品はできれば実装するまで曲げたくない

バナナプラグとワニグチクリップで自作すればいいかなと思ったが
よく調べると「4線ケルビン接続計測」という
よくわからないが精度が高そうな測定方式に対応しているようなので
一応専用のテストリードも買っておいた。

測定器関連の自作も楽しいんだが信頼性とトレードオフになるので
値段と比べての苦渋の決断である。



思ってたよりでかいので通販で買う人は注意。

2014年5月22日木曜日

Foxey Lady 完成(?)

ホムセンでリーマが売ってなかったので
ステップドリルの段差がないみたいなのを買ってきた



これなら微妙なサイズの穴あけもできそうと思ったんだが
インパクトドライバの噛むところが六角なので入らない

たかだか1mm以下なので
手回しで穴をごりごりこじ開けた

なんとかサイズは出せてDCジャックは収まったが
指が痛い

六角→丸軸に変換する奴があるみたいなので
次必要になった時は検討してみる

音出し実験でPhone-Phoneのケーブルが足りないことに気づいたので
急遽作ることにした









ミニジャックと違って標準フォンはハンダ付けも楽である

Foxey Lady は
ちょいちょいあやしい時もあるが
無事ケースに収められた





ケーブル使ってて思ったが
パッチ用には太いケーブルより
しなやかなケーブルのほうが使い勝手がいい

細いケーブルだと見た目はぶさいくだがしかたない

2014年5月19日月曜日

Foxey Lady 続き・ケース加工

『サウンド・クリエイターのためのエフェクタ製作講座』では
ケース加工図も公開してくださってるが
CADソフトの使い方をすぐ忘れてしまうので改めて図面を引いてみた。

スプレーのりでケースに貼り付けてポンチ打ち。



TV番組とかでよく「1mmの狂いもなく」みたいなことを聞くが
1mmもずれたら大事である。

バイスに挟んで穴あけ。


とにかくうるさくて夜中にはできない作業なので
ある程度、予定を組んでやらないといけない。

穴あけはまあまあうまくいったが、DCジャックの穴が小さすぎて
入らねぇwww



ステップドリル(?)の最大経が12φなんでこれ以上大きくできない

これはリーマーがないと無理かもしれない

今度ホムセンに行った時に買ってこよう

というわけで、作業途中で保留ということになりました。







2014年5月17日土曜日

Foxey Lady

シミュレーションと理論を調べてばっかりだったので
そろそろ実作がしたくなった

勢いでエフェクタを組んでみることにした

『サウンド・クリエイターのためのエフェクタ製作講座』
http://www.diskdig.com/hmp3/welcome.htm

に載っているFoxey LadyというFuzzにした

前からシミュレーションとブレッドボードでの試作はしてたので
多分行けるはずだと思ってやってみた

PaaSで配線図を書いてチェックして

ユニバーサル基板を金ノコで切って部品を並べた



スペース的には大丈夫そうなので
半日かかってハンダ付けした



いつものようにタブレットのファンクションジェネレーターでサイン波出して
念のためテスタで電圧測って実験用のスピーカーで音出ししてみたが
なんか変

音出してもFuzzというよりノイズみたいだし
ソフトオシロで波形見てもシミュレーションの結果とかけ離れてる

LTSpiceのシミュレーション波形

現実世界の波形


なので回路図見ながら導通と抵抗値のチェックをしたら
やっぱり配線が間違ってた(^q^;

ビール飲みながらなのでもうやめようかと思ったが
原因がわかると直したくなってしまうので酔いが回るまでがんばった

結果




シミュレーション通りの波形が出た


ちょうど酔いがまわってきそうである






2014年5月14日水曜日

Mixerのテスト(続き)

受け側の入力インピーダンスが高いと盛大に入力漏れする。

なので、Line出力にボルテージフォロワを入れてみた。





ヘッドホンの方はボリューム調整用に非反転増幅が入っているのだが
少し変な回路構成なので若干入力が漏れる。

入力漏れの解消とドライブ能力の向上のために
ヘッドホン出力の出力段にも4560のボルテージフォロワを入れた。

ブレッドボードで片チャンネル×2のミキサーを組んで実験した。




このオペアンプだと特に発振防止も必要なさそうなのでコンデンサは全部取ってみた。

ACアダプタが意外と邪魔くさいので
単3×6本、安定化無しで組んでみるつもりだ。

2014年5月10日土曜日

Mixerのテスト



Line出力の部分だけブレッドボードで組んでみたら
ちょっとした問題が発覚

電源をオフにしても減衰はしてるんだが
入力波形がそのまま出力される



回路図を眺めてオペアンプの部分をオープンにして考えて見ると
抵抗が多段で入ってはいるものの
入力から出力まで筒抜けだ

とりあえずで10kΩにしてた抵抗を100kΩに直した

まだ漏れはあるけど60dBぐらいまで減衰してるみたいなので良しとするか

どこかに非反転増幅段を入れればバッサリ切れていいのかもしれないが

実用上問題なければできればスルーしたいところだ

もう少し実験の必要があるな

2014年5月8日木曜日

LFOの波形の測定はソフトオシロでは無理なのか

555の普通の矩形波発振回路でどこまでやれるか やってみた

   

可聴帯域以下の周波数はまともに測れない コンデンサを0.1uFぐらいから470uFぐらいまで差し替えて実験したが 1Hzぐらいの周波数が限界だった



回路がアホだから発振しないのか測定器がアホだから 測定できないのかわからない

 オーディオインターフェイスを分解してカップリングコンデンサ外したろかとも思うが それはやめておきます

 デジタルテスタのDCモードだと なんか動いてた気がするんだが いかんせん離散系なのでまじめに測定しないとわかんない

 アナログテスターが欲しくなってきました

2014年5月5日月曜日

LTSpiceのお勉強 Moog Ladder Filter


『達人と作るアナログ・シンセサイザー入門』を参考にして
LTSpiceでLadder Filterのシミュレーションをしてみた



電流でカットオフ周波数は制御できている

電源電圧は5Vにしてみたが特に問題なさそうである

トランジスタと電圧の組み合わせで
なんでフィルタになるんだろうと思っていたが

この本を読んでいろいろ調べてまあまあ分かった気になった

理論はあとからついてくるのだな

2014年5月4日日曜日

NE555でピュンピュン失敗


ノコギリ波のLFOを555で実装するのはなかなか難しい
シミュレーションではうまくいったが
ブレッドボードの試作ではうまくいかない

2Hzぐらいまでは発振してくれたんだがR4,R2の数値を上げていくと
発振しなくなる

0.1HzぐらいまでいかないとLFOとしては役に立たない

あきらめて555のLFOは出せる波形だけにして
VCOの方をノコギリ波も出せるようにするかな

最悪LFOはマイコン出力でもいいし

制御工学はまじめに勉強するとしんどそうなので
NFBやフィルタの設計には
何やら怪しげな伝達関数というものがあって
モデル化するにはとても便利!

という理解で一旦保留します

LTSpiceの使い方は「エレキジャック」のページがわかりやすかった
http://www.eleki-jack.com/KitsandKids2/cat196/ltspice/

いよいよMoogFilterに手をつける

2014年5月2日金曜日

LTSpiceのお勉強 NE555でピュンピュンマシン

ノコギリ波を紹介しているとこがあったので
過去のトラ技も参考にしつつLTSpiceでシミュレーションしてみた



555のサイレンマシン(≒ピュンピュンマシン)の作例を見ると
FMのソースをCVに直結してるのが多かったので
直結したらまあまあうまくいった

このノコギリ波発振回路なら鈍ることなくシャープなノコギリ波になるみたいな
ことだったがブレッドボードで実験したらなまってた


オーディオインターフェイス越しのソフトオシロだから
ダメなのか

いやしかし結局オーディオインターフェイス越しじゃないと音源として使えないしな

と思って単体でシミュレーションしなおしたら
下のほうがGNDにひっかかってた



まあいい

クソ波形のほうが面白い