2016年4月4日月曜日

DCF(Digital Controled Filter)の構想

Moog Ladder Filter




何度見てもこの回路図は恐ろしい。最初はほとんど意味がわからなかったが、わからないながらも電圧-電流変換、ラダーフィルター本体、差動-シングルエンド変換という部分で成り立っていそうなことはなんとなくわかってきた。

ラダーフィルター本体は、「Analysis of the
Moog Transistor Ladder and Derivative Filters Timothy E. Stinchcombe
25 Oct 2008」を読んで見るとTrとRの組み合わせた回路に電流を流すことで電流で抵抗値を制御している。Trのペアは5段あるが真ん中の3段が可変抵抗として働いていてTrに挟まれたCと組み合わせて3次CRフィルタとなっているらしい。

<追記: 2016/04/10>

真ん中3段ではなくて上4段がRCフィルタと働いて4次LPFとなっているようです。勘違いしていました。

</追記>

VCVS LPF Filter


Moog Ladder Filterはもう少し調べてみたいので、Q(Resonant)が調整できるフィルターで実作するつもりで、一番かんたそうなVCVS LPFでやってみることにした。

純粋なアナログ・シンセなら抵抗値を電圧で可変するためにアナログ素子を駆使するところだが、デジタル・ポテンショメータならマイコンで簡単に(安定的に)抵抗値を可変できる。

Qの調整は「デジタル・ポテンショメータでLPFのQをコントロールする」でやってみたので、R1、R2も可変にしてカットオフ周波数も変更する実験をしてみた。

増幅率A≒1でシミュレーション


Rq1は1f(フェムト)なのでRq1はほぼ短絡、Rq2はほぼ絶縁なので普通のA=1の2次VCVS LPFとして見る。


Cが0.01uFだとRが1kΩ~100kΩで、カットオフ周波数fc=100Hz~10kHz程度で可変できるようだ。

デジタル・ポテンショメータのAD8403をArduino(びんぼうでいいの)で制御してみた。

ブレッドボード図


OPAMPを使ったLPF本体は5V単電源の分圧だと電圧が足りないようなので、別に±5Vの電源を用意した。

Arduinoのスケッチ
/*
  Digital Pot Control

  AD8403

  3つのPOTの出力電圧を読み取って
  Digi-Potのチャンネル1, 2, 4の抵抗値を可変

  Pinの接続
  A0 POT1
  A1 POT2
  A3 POT3
  10 CS
  11 MOSI
  13 SCK
  
  Digi-Pot
  A1 - connect this to voltage
  W1 - this is the pot's wiper, which changes when you set it
  B1 - connect this to ground.
*/

// inslude the SPI library:
#include <SPI.h>

// set pin 10 as the slave select for the digital pot:
const int slaveSelectPin = 10;

byte cnt;
byte v0, v1, v3;

void setup() {
  // set the slaveSelectPin as an output:
  pinMode (slaveSelectPin, OUTPUT);
  // initialize SPI:
  SPI.begin();
  delay(1);

  Serial.begin(9600);  
}

void loop() {
  v0 = analogRead(0) / 4;
  v1 = analogRead(1) / 4;
  v3 = analogRead(3) / 4;
  
  Serial.print(v0);
  Serial.print("\t");
  Serial.print(v1);
  Serial.print("\t");
  Serial.print(v3);
  Serial.print("\n");
  
  digitalPotWrite(0, v0);
  digitalPotWrite(1, v1);
  digitalPotWrite(3, v1);
  delay(1);
}

void digitalPotWrite(int address, int value) {
  // take the SS pin low to select the chip:
  digitalWrite(slaveSelectPin, LOW);
  //  send in the address and value via SPI:
  SPI.transfer(address);
  SPI.transfer(value);
  // take the SS pin high to de-select the chip:
  digitalWrite(slaveSelectPin, HIGH);
}


動作状況を動画に撮ってYoutubeに上げてみた。


発振すれすれが音的にはおもしろいなあ(^q^/