月別アーカイブ: 2006年8月

ボコーダーのプログラム

8月はなぜか毎年本業がとても忙しく、ここ1ヶ月ハンダゴテを使っていません。かなりストレスがたまってきたので、ソフトでちょこっと遊んでみました。

C++ で大雑把に書いていたボコーダのプログラムを少し整理、C で書き直して、さらに色んなプラットフォームにのせやすいようにメモリ管理まわりをちゃんと設計してみました。

ボコーダの心臓部のプログラムをちょびっと公開。線形予測分析+合成フィルタ、以上。コーデックとして作るとかなり難しいですが、楽器だとあえていい加減に作ってかまわないので、拍子抜けするほど簡単です。
そのうちきちんと公開したいと思います。(ああ、もうこんな時間。寝なくては)

/**
* vocoder
* The vocoder process.
* Note: The voice input will be changed by this function. (because of hann())
*/
void
vocoder(Processor* processor,
float voice[], float excit[], float out[])
{
/* temporal buffers */
float* corr;
float* lpc;
float* ref;

/* parameters */
register int frameSize, np, ip, ismp;
float ratio, level, power;
VocoderParameters* params;

/* fetch frequently-used parameters from the processor */
frameSize = processor->frameSize;
params = (VocoderParameters*)processor->parameters;
np = params->np;

/* get temporal beffer memory from the stack */
corr = (float*)stack_push(processor->stack, (np + 1) * sizeof(float));
lpc = (float*)stack_push(processor->stack, (np + 1) * sizeof(float));
ref = (float*)stack_push(processor->stack, (np + 1) * sizeof(float));

/* get the LPC coefficients */
power = hann(voice, frameSize);
autoCorrelate(frameSize, voice, np, corr);
ratio = levinsonRecursion(np, corr, lpc, ref);

#ifdef _DEBUG
vocoder_debug_print(corr, lpc, ref, ratio, np);
#endif

/* The synthesis filter. */
{
float* buf = params->outBuffer;
level = (float)(sqrt(power*ratio/frameSize) * 0.5f);
iir(frameSize, out, excit, ip, buf, lpc, level);
}

stack_pop(processor->stack, (np+1) * 3 * sizeof(float));
}

本家 Wiki 化

いつまでたっても更新されない私の本家ページですが、更新されない二大理由は、
「HTML ファイル編集なんてめんどくさい!」
「更新のたびにダウンロード -> 編集 -> アップロードなんてやってられん!」
であります。

このような苦痛から逃れるため、本家ページを一部 WIKI 化しはじめました。
http://www.iwakami.cc/synth/technotes/index.html
ページ上部のリンクタグだけ WIKI 外というのがかっこ悪いですが、
リンクタグのつけ方わからなかったんです。
やりたいことは手早く簡単に、を心がけているので、とりあえずこれでがまん。

これで多少は更新するようになるかしら自分(甘いような気もします)

DSP

本業にどっぷりでハンダゴテで遊べない今日この頃、つまらないので、まあソフトなら通勤電車で書けるでしょうと、ソフトで遊んでます。

たわむれに、こんなん作ってみました

ま、こんなとこだな。

なかなか楽しいです。