新版 民主党の研究2009/08/06 00:38

● 読書記録
新版 民主党の研究  塩田 潮著
★★★☆☆
『総選挙で権力が移動する「王道の政権交代」は果たして実現するのか。はたまた政界再編の始まりか。その政権担当能力をふくめ、民主党の本質に迫る。』
「革命」に備えて一応勉強しておこうということで。
鳩山、菅、小沢の3巨頭、および岡田、前原ら若手のこれまでの経歴や考え方などがざっくりわかります。ただ文章力不足というか、あまりぐいぐい引き込んでいくようなタイプの本ではありません。読み進めるのがやや苦痛でした。
菅さんが東工大出身だということは知っていましたが、鳩山さんも理系(東大)だそうで好感度アップしました。

あの日にドライブ2009/08/06 01:07

● 読書記録
あの日にドライブ  荻原 浩著
★★★★★
『牧村伸郎、43歳。元銀行員にして現在、タクシー運転手。もう一度、人生をやり直すことができたら。伸郎は自分が送るはずだった、もう一つの人生に思いを巡らせ始めるのだが…。 』
ひさびさに小説を読みました。タイトルから重松清「流星ワゴン」的なSF ものを想像して買ったのですがよい方向に裏切られました。40代の男性(東京在住、車好きならなお)にはおすすめです。感動はありませんが、共感できる箇所がいくつもあると思います。

dsPICでボコーダ2009/08/17 12:08

以前PC用につくったボコーダプログラムをdsPIC用に書き直してみました。
固定小数点のプログラミングがなかなかうまくいかず非常に苦労しました。dsPIC(C30コンパイラ)にはfractionalという固定小数点型があって、これを利用すると積和演算などが高速に行えるということなのですが、計算途中でオーバフローを起こしているらしく、うまく使えませんでした。結局long int型を使ってなんとか動かすことができました。
計算速度の関係でサンプリング周波数は4kHz、フィルタのタップ数は4としています。そのためボコーダとしては最低の性能になっていると思います。何と発音しているかは識別できません。タップ数を増やせないのが致命的です。

#include 
#include "adc10.h"
#include "timer.h"
#include "dsp.h"

// Configuration bits--------------------------------------------------------
_FOSC(CSW_FSCM_OFF & FRC_PLL16);   //FRC with 16xPLL oscillator, Failsafe clock off
_FWDT(WDT_OFF);                  //Watchdog timer disabled
_FBORPOR(PBOR_OFF & MCLR_EN);    //Brown-out reset disabled, MCLR reset enabled
_FGS(CODE_PROT_OFF);             //Code protect disabled

//// Setup Data for 10bits A/D Converter
//// AN0のみサンプル Tad=200nsec@40MHz
//// タイマ3で自動スタート, 自動スキャン無し
unsigned int ValueADCON1 = ADC_MODULE_ON & ADC_IDLE_STOP & ADC_FORMAT_INTG &
			ADC_CLK_TMR & ADC_AUTO_SAMPLING_ON & ADC_SAMPLE_INDIVIDUAL & 
			ADC_SAMP_OFF;
unsigned int ValueADCON2 = ADC_VREF_AVDD_AVSS & ADC_SCAN_OFF & ADC_CONVERT_CH0
			 & ADC_SAMPLES_PER_INT_1 & ADC_ALT_BUF_OFF & ADC_ALT_INPUT_OFF;
unsigned int ValueADCON3 = ADC_SAMPLE_TIME_1 & ADC_CONV_CLK_SYSTEM 
			 & ADC_CONV_CLK_2Tcy;
unsigned int ValueADPCFG = ENABLE_AN0_ANA & ENABLE_AN1_ANA & ENABLE_AN2_ANA
			 & ENABLE_AN3_ANA;
unsigned int ValueADCSSL = 0;
unsigned int Channel0 = ADC_CH0_POS_SAMPLEA_AN0 & ADC_CH0_NEG_SAMPLEA_NVREF;

// Definitions---------------------------------------------------------------
#define BUF_LEN 256
#define LPC_ORDER 4

//グローバル変数-----------------------------------------------------------------
long int lpc[LPC_ORDER+1];
long int in_buf[BUF_LEN];
long int out_buf[LPC_ORDER+1];
int ix_buf = 0;
int ix_read = 0;
int ix_write = 0;
int ratio = 0;
int s_cnt = 0;		//音程用
int zero_cnt = 0;
unsigned char sound = 0;

//// タイマ1割り込み処理(16k/256/2Hz)
void _ISR _T1Interrupt(void)
{
	int n,m,k;
	int i,j;
	long int r[LPC_ORDER+1];
	long int a[LPC_ORDER+1];
	long int b[LPC_ORDER+1];
	long int alfa;
	long int km,alfam,t;
	
	IFS0bits.T1IF = 0;
	
	//AutoCorrelation
	for(i=0; i<=LPC_ORDER; i++){
		r[i] = 0;
		for(j=0; j<(BUF_LEN-i); j++){
			r[i] += ((in_buf[j] * in_buf[j+i])>>8);
		}
	}

	//Levinson-Durbin
	a[0] = 1<<8;
	alfam = r[0];
	for(m=1; m<=LPC_ORDER; m++){
		t = r[m];
		for(k=1; k<=m-1; k++){
			t = t + ((r[m-k]*a[k])>>8);
		}
		if(alfam==0)alfam=1;
		km = -((t<<8)/alfam);
		for(k=1; k<=m-1; k++){
			b[k] = a[m-k];
		}
		for(k=1; k<=m-1; k++){
			a[k] = a[k] + ((km*b[k])>>8);
		}
		a[m] = km;
		alfam = (alfam*((1<<8) - ((a[m]*a[m])>>8)))>>8;
	}
	alfa = alfam;
	for(i=0; i0; i--){
		out_buf[i-1] = 0;
	}
}

//// ADC割り込み処理(約16kHz)
void _ISRFAST _ADCInterrupt(void)
{
	long int tone;
	fractional SigIn;
	long int out;
	int d_out;
	int i;
	int on;
		
	IFS0bits.ADIF = 0;
	
	//音程生成
	s_cnt++;
	if(s_cnt==16){
		s_cnt = 0;
		tone=1<<7;
	}else{
		tone=0;
	}
	
	//AD input
	in_buf[ix_buf] = (long int)(ReadADC10(0)>>2)-128;
	if(in_buf[ix_buf]<32 && in_buf[ix_buf]>-32){
		in_buf[ix_buf]=0;
		zero_cnt++;
		//sound = 0;
	}else{
		sound = 1;
		zero_cnt = 0;
	}		
	if(zero_cnt>10){sound = 0;}
	if(sound==0){tone = 0;}
	ix_buf++;
	if(ix_buf>=BUF_LEN){
		ix_buf = 0;
	}	
	
	
	//合成フィルタ
	out = -(	((lpc[0] * out_buf[0])>>8)
					+ ((lpc[1] * out_buf[1])>>8)
					+ ((lpc[2] * out_buf[2])>>8)
					+ ((lpc[3] * out_buf[3])>>8)
					)
					+ tone;
	for(i=LPC_ORDER; i>0; i--){
		out_buf[i] = out_buf[i-1];
	}
	out_buf[0] = out;

	//出力処理
	d_out = 0x7000 | ((0x8000 + (out<<7))>>4);
	LATEbits.LATE0 = 0;  //CS=0
  	for(i=0; i<16; i++){
    	if(((d_out << i) & 0x8000) != 0){
      		LATEbits.LATE2 = 1;  //SDI=1
    	}else{
      		LATEbits.LATE2 = 0;  //SDI=0
    	}
    	LATEbits.LATE1 = 1;  //SCK=1
    	LATEbits.LATE1 = 0;  //SCK=0
  	}
  	LATEbits.LATE0 = 1;  //CS=1
  	LATEbits.LATE3 = 0;  //LDAC=0
  	LATEbits.LATE3 = 1;  //LDAC=0
}

//main-----------------------------------------------------------------------
int main(void)
{
	int i,j;
	int data;
	
//Initialize
	LATE = 0x0000;	//

// Setup Port
	TRISB = 0x01;	//AN0 input
	TRISE = 0x00;	//all output
	SRbits.IPL=4;	//Set CPU priority Set core priority level to 4

// Setup ADC10		
	OpenADC10(ValueADCON1, ValueADCON2, ValueADCON3, ValueADPCFG, ValueADCSSL);
	SetChanADC10(Channel0);
	ConfigIntADC10(ADC_INT_PRI_7 & ADC_INT_ENABLE);

// タイマ1設定 サンプリング周期 4/256/2kHz = (7.37MHz*16/4)/256/3684
	OpenTimer1(T1_ON & T1_GATE_OFF & T1_PS_1_256 & T1_SOURCE_INT,3684*2-1);
	IPC0bits.T1IP = 5;
	IFS0bits.T1IF = 0;
	IEC0bits.T1IE = 1;

// タイマ3設定 サンプリング周期 4kHz = (7.37MHz*16/4)/1842
	OpenTimer3(T3_ON & T3_GATE_OFF & T3_PS_1_1 & T3_SOURCE_INT,1842*4-1);

// init mcp4922
	LATEbits.LATE0 = 1;	//CS
	LATEbits.LATE1 = 0;	//SCK
	LATEbits.LATE2 = 0;	//SDI
	LATEbits.LATE3 = 1;	//LDAC
	
//Idle Loop
	while (1){};
}

「人はなぜツール・ド・フランスに魅せられるのか」2009/08/17 20:30

● 読書記録
人はなぜツール・ド・フランスに魅せられるのか 土肥 志穂著
★★☆☆☆
『世界はなぜ、このレースに魅了されるのか。2000年より現地でツールを継続取材する著者が、自ら目撃したランス・アームストロングをはじめとする 伝説の名選手、名勝負のエピソードを紹介し、その魅力の全てを書き尽くす』

Jスポーツでツール・ド・フランスを見たので読んでみました。
いまいち、です。金を払って著者の個人ブログを読まされたような、読者に何を伝えたいのかがさっぱりわかりませんでした。巻末の鶴見辰吾さんによるあとがきに救われている感じです。

VS1053BでMIDIシンセサイザ2009/08/26 14:01

回路図
MIDIデコーダ機能のあるVS1053Bを使ってMIDIシンセサイザーを作り始めました。とりあえず音を出すだけなら、マイコン(PIC24F)のUART出力をVS1053BのRX端子につなげばOKです。
プログラムはごく基本的なもので、whileループで約1秒ごとにピアノの”ド”の音が鳴るようになっています。

#include 
#include 

_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF &	BKBUG_OFF
	 & COE_OFF & ICS_PGx1& FWDTEN_OFF ) 
_CONFIG2( IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_ON & IOL1WAY_OFF & POSCMOD_NONE )

//********************
// INIT_DATA
//********************
void init_data(void){
}

//**************************
// MAIN
//**************************
int main(void){
	int i,j;
	
	CLKDIV = 0;			// クロック1/1
	/* 入出力ポート設定  */
	AD1PCFG = 0xFFFE;	// すべてデジタル(AN0をのぞく)
	//TRISA = 0xffff;		//portA pa1 output
	TRISB = 0xfffe;		//portB all input pb0 output
	
	RPOR0bits.RP0R = 3;		//UART1 TX to RP0
	//UART1初期設定
	U1BRG = 31;
	U1MODE = 0b1000100000000000;
	U1STA = 0b0000010000000000;
	
	//init_data();
	while(U1STAbits.UTXBF==1);
	U1TXREG = 0xC0;
	while(U1STAbits.UTXBF==1);
	U1TXREG = 0x00;
	/**************** メインループ **********/
	while(1){
		while(U1STAbits.UTXBF==1);
		U1TXREG = 0x90;
		while(U1STAbits.UTXBF==1);
		U1TXREG = 0x3C;
		while(U1STAbits.UTXBF==1);
		U1TXREG = 0x40;
		for(i=0;i<30000;i++){for(j=0;j<100;j++){}}
	}
}