Perfumeボイスを高位合成/HDLコード生成でZynq実装!その1


Perfumeボイス

Perfumeの独特な機械っぽいボイスはVocoderというエフェクトを使っている。
https://www.youtube.com/watch?v=KbiSxunJatM

Vocoderの曲はこの辺で見れる。https://www.youtube.com/watch?v=0kEHP2aUItA

VST Pluginなんかでフリーでもあると思うが、ZynqのボードZed Boardに実装してみようと思う。

Zynq

ARM Cortex-AとFPGAが1チップになったものだが、今回は信号処理部分はFPGA側に実装予定。
Zed BoardにはAudio Codec(AD/DA)が実装されていて、Mini Pin Jackのアナログオーディオ入出力が付いている。これを使う。

Vocoderアルゴリズム

昔買ったエフェクター自作術とかって本にアナログ回路でVocoder作成例が載っていたので、これをディジタル化することにした。一部抜粋(問題あれば削除します。)

基本的にはオクターブバンドのBPF、Envelope Follower、VCA(Voltage Controled Amplifier)で構成されている。下図はブロック図。

まずはOctave Filter設計

MATLABでOctave Filterを設計

%% Design octave filters
% Parameters
BandsPerOctave = 1;
N = 4;           % Filter Order
F0 = 1000;       % Center Frequency (Hz)
Fs = 44100;      % Sampling Frequency (Hz)

f = fdesign.octave(BandsPerOctave,'Class 1','N,F0',N,F0,Fs);
%% Design filters

F0 = validfrequencies(f);
Nfc = length(F0);
for n=1:Nfc
    f.F0 = F0(n);
    Hd(n) = design(f,'butter', 'FilterStructure', 'df1sos');
end
%% Visualize
hfvt = fvtool(Hd,'FrequencyScale','log','color','white');
axis([0.01 Fs*1.2e-3/2 -90 5])
title('Octave-Band Filter Bank')

フィルタの応答

音声信号入力してシミュレーションできるよう、Simulinkブロック生成

%% Simulink block generation
for n=1:Nfc
    realizemdl(Hd(n), 'Blockname', ['Octave' num2str(n)])
end

生成されたのがこれ。

その2に続く・・・次回はEnvelope Filterなど作っていきたいと思っています。