LoginSignup
2
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-13

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作成例が載っていたので、これをディジタル化することにした。一部抜粋(問題あれば削除します。)

vocoder_schema.png

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

vocoder_blockdiagram.png

まずは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')

フィルタの応答
OctFiltBank.png

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

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

生成されたのがこれ。
octFiltModel.png

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3