Perfume 음성을 고위 합성/HDL 코드 생성으로 Zynq 구현! 그 3

Octave Filter와 Envelope Filter의 통합



전회 설계한 대역 분할용의 Octave Filter와, 포락선을 취하는 Envelope Filter를 통합해, 드디어 Vocoder로서 동작하는 상태로 한다.

신디사이저 소리



신디사이저음과 성음을 곱하기 때문에, Simulink에서 신디사이저음을 작성한다.
우선, 옛날의 FM 신디와 같은 소리로 좋기 때문에, Audio Toolbox의 Wave Synthesizer 블록을 사용해, 톱니파(-1부터 +1까지 증분을 반복할 뿐)을 생성한다. 이 블록은 피아노의 소리라든지에서도 MATLAB에 파형 데이터를 받아들이면, 지정한 피치로 출력해 주기 때문에 재미있다.
덧붙여 이 블록은 FPGA 실장할 수 없기 때문에, 나중에 변경할 필요가 있다.



이 블록을 드레미파솔라시드의 8음 준비해, 화음을 울릴 수 있도록 해, 각각의 On/Off 스위치를 붙인 모델이 이것. MATLAB/Simulink는 이러한 벡터 데이터를 사용한 처리에서도, 모델은 1개만 만들면 좋기 때문에 매우 간단.


440Hz의 기준음인 A3음을 울려 주파수를 확인.


덧붙여서 드레미파소라시드 각 소리의 주파수는 이 식으로 구해진다.
Pitch = [60, 62, 64, 65, 67, 69, 71, 72];   % MIDI Note No.
waveFreq = 440*(2.^((Pitch-69)/12))';

톱니파는 좋은 상태에 고조파가 타고 있기 때문에 이것이 신디 소리로서는 좋다.


이곳은 소위 도미소의 C 코드 (C 언어가 아니라 화음의 C)의 시간축 응답과 스펙트럼.



모든 구성 요소 통합



지금까지 작성한 컴퍼넌트를 1개의 모델에 통합한다.
컴퍼넌트 단위로는 기대한 동작을 하고 있었지만, 통합해 시뮬레이션하는 것으로, 문제가 나오는 일도 있으므로, 이 모델로의 시뮬레이션은 매우 중요. 또, 이 모델로 처음으로 Vocoder로서의 관능 평가(제대로 소리로 듣고 평가)도 가능하게 된다. 또, 알고리즘 자체의 통합 검증을 주목적으로 하고 있으므로, 아직 고정 소수점화하거나 HDL 코드 생성할 수 있게 되어 있지 않다.

톱 계층에는 음성 데이터의 입출력, 신디음의 On/Off 스위치 등을 배치했다.


구현 대상인 서브 시스템의 처리 내용 : Octave Filter를 음성 데이터와 신디음에 걸친다(9ch 출력) Octave Filter 출력에 9ch 각각 곱한다⇒9ch데이터를 Mix(가산)⇒음량 조정해 끝.



A3음과 음성 데이터를 입력으로 하고 Vocoder를 걸어 보면, 아래 그림과 같이 Vocoder음은 깨끗이 440Hz와 그 배음이라는 구성의 스펙트럼이 되었다.
상단의 하늘색 파형은 음성 입력의 시간축과 스펙트럼, 하단 적색 파형은 Vocoder 출력의 시간축 응답과 스펙트럼


그 4에 이어. 다음 번은 드디어 구현일까.

좋은 웹페이지 즐겨찾기