HDL Tone Control Filter Bank

Этот пример иллюстрирует, как сгенерировать HDL код для банка 24 стеллажных фильтров первого порядка, которые реализуют управление звуковым тоном с шагом 1 дБ от -6 дБ до + 6 дБ для баса и требла.

Фильтры аналитически спроектированы с помощью простой формулы для фильтра первого порядка с одним шестом и одним нулями на действительной оси.

Группа фильтров спроектирована, так как изменение коэффициентов фильтра на лету может привести к переходным процессам в аудио (кликах и нажатиях), когда управление ускорением/вырезом перемещается. Когда банк фильтров работает постоянно, соответствующий фильтр выбирается из набора фильтров, когда выход близок к любому нулю пересечению, чтобы избежать этих переходных процессов.

Настройте параметры

Используйте частоту дискретизации CD 44,1 кГц с басовыми и требловыми углами частотой 100 Гц и 1600Hz.

Fs  = 44100;                            % all in Hz
Fcb =   100;
Fct =  1600;

Задайте параметры отображения тангенциальной частоты

Отобразите угловые частоты по тангенсу, чтобы перейти от аналоговой к цифровой области. Затем задайте область значений применяемых вырезов и усилений, выбрав общую область значений 12 дБ за 1 дБ. Преобразуйте децибелы в линейный коэффициент усиления и разделите векторы повышения и разрезания.

basstan   = tan(pi*Fcb/Fs);
trebletan = tan(pi*Fct/Fs);

dbrange  = [-6:-1, +1:+6];              % -6 dB to +6 dB 
linrange = 10.^(dbrange/20);
boost = linrange(linrange>1);
cut   = linrange(linrange<=1);
Nfilters = 2 * length(dbrange);         % 2X for bass and treble

Проектирование банка фильтров

Завершите билинейное преобразование полюсов, затем вычислите нули фильтров на основе необходимого повышения или разреза. Поскольку boost и cut являются векторами, мы можем проектировать все фильтры одновременно с помощью векторной арифметики. Обратите внимание, что a1 всегда является одним из этих фильтров.

a2_bass_boost    = (basstan - 1) / (basstan + 1);
b1_bass_boost   = 1 + ((1 + a2_bass_boost) .* (boost - 1)) / 2;
b2_bass_boost   = a2_bass_boost + ...
                  ((1 + a2_bass_boost) .* (boost - 1)) / 2;

a2_bass_cut      = (basstan - cut) / (basstan + cut);
b1_bass_cut     = 1 + ((1 + a2_bass_cut) .* (cut - 1)) / 2;
b2_bass_cut     = a2_bass_cut + ((1 + a2_bass_cut) .* (cut - 1)) / 2;

a2_treble_boost  = (trebletan - 1) / (trebletan + 1); 
b1_treble_boost   = 1 + ((1 - a2_treble_boost) .* (boost - 1)) / 2;
b2_treble_boost   = a2_treble_boost + ...
                    ((a2_treble_boost - 1) .* (boost - 1)) / 2;

a2_treble_cut      = (cut .* trebletan - 1) / (cut .* trebletan + 1);
b1_treble_cut     = 1 + ((1 - a2_treble_cut) .* (cut - 1)) / 2;
b2_treble_cut     = a2_treble_cut + ...
                    ((a2_treble_cut - 1) .* (cut - 1)) / 2;

Создайте банк фильтров

Создайте числитель и массивы знаменателей для всей группы фильтров. Затем создайте массив ячеек из фильтров в форме {b, a, b, a,...} для fvtool. Предварительно выделите массив ячеек для скорости.

filterbank = cell(1, 2*Nfilters);     % 2X for numerator and denominator
% Duplicate a2's into vectors
a2_bass_boost   = repmat(a2_bass_boost,   1, length(boost));
a2_bass_cut     = repmat(a2_bass_cut,     1, length(cut));
a2_treble_boost = repmat(a2_treble_boost, 1, length(boost));
a2_treble_cut   = repmat(a2_treble_cut,   1, length(cut));

filterbank_num = [b1_bass_cut, b1_bass_boost, b1_treble_cut, b1_treble_boost ; ...
                  b2_bass_cut, b2_bass_boost, b2_treble_cut, b2_treble_boost ]';
% a1 is always one
filterbank_den = [ones(1, Nfilters); ...
                  a2_bass_cut, a2_bass_boost, a2_treble_cut, a2_treble_boost]';

filterbank(1:2:end) = num2cell(filterbank_num, 2);
filterbank(2:2:end) = num2cell(filterbank_den, 2);

Проверьте ответ банка фильтров

Используйте fvtool в журнал частотном режиме, чтобы увидеть аудио диапазон более четко. Также установите частоту дискретизации.

fvtool(filterbank{:}, 'FrequencyScale', 'log', 'Fs', Fs);

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 24 objects of type line.

Создайте квантованный банк фильтров

Создайте квантованный фильтр для каждого фильтра двойной точности, разработанного выше. Предположим, что качество CD составляет 16 бит, а выход слова составляет 18 бит, чтобы обеспечить усиление + 6 дБ с некоторым запасом.

quantizedfilterbank = cell(1, Nfilters);
for n = 1:Nfilters
  quantizedfilterbank{n} = dsp.BiquadFilter('Structure','Direct Form I');
  quantizedfilterbank{n}.SOSMatrix = [filterbank_num(n,:),0,...
                                      filterbank_den(n,:),0];

  quantizedfilterbank{n}.NumeratorCoefficientsDataType         = 'Custom';
  quantizedfilterbank{n}.CustomNumeratorCoefficientsDataType   = numerictype([],16);
  quantizedfilterbank{n}.CustomDenominatorCoefficientsDataType = numerictype([],16);
  quantizedfilterbank{n}.CustomScaleValuesDataType             = numerictype([],16);
  
  quantizedfilterbank{n}.OutputDataType       = 'Custom';
  quantizedfilterbank{n}.CustomOutputDataType = numerictype([],18,15);
  
  quantizedfilterbank{n}.SectionOutputDataType       = 'Custom';
  quantizedfilterbank{n}.CustomSectionOutputDataType = numerictype([],18,15);
  quantizedfilterbank{n}.NumeratorProductDataType    = 'Full precision';
  quantizedfilterbank{n}.DenominatorProductDataType  = 'Full precision';
  
  quantizedfilterbank{n}.NumeratorAccumulatorDataType         = 'Custom';
  quantizedfilterbank{n}.CustomNumeratorAccumulatorDataType   = numerictype([],34,30);
  quantizedfilterbank{n}.DenominatorAccumulatorDataType       = 'Custom';
  quantizedfilterbank{n}.CustomDenominatorAccumulatorDataType = numerictype([],34,29);
  
  quantizedfilterbank{n}.RoundingMethod  = 'Floor';
  quantizedfilterbank{n}.OverflowAction  = 'Wrap';
end

Проверьте ответ квантованного банка фильтров

Проверьте квантованный банк фильтров с помощью fvtool снова в режиме частоты журнала с набором частот дискретизации.

fvtool(quantizedfilterbank{:}, 'FrequencyScale', 'log', 'Fs', Fs,'Arithmetic','fixed');

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 48 objects of type line. These objects represent Filter #1: Quantized, Filter #1: Reference, Filter #2: Quantized, Filter #2: Reference, Filter #3: Quantized, Filter #3: Reference, Filter #4: Quantized, Filter #4: Reference, Filter #5: Quantized, Filter #5: Reference, Filter #6: Quantized, Filter #6: Reference, Filter #7: Quantized, Filter #7: Reference, Filter #8: Quantized, Filter #8: Reference, Filter #9: Quantized, Filter #9: Reference, Filter #10: Quantized, Filter #10: Reference, Filter #11: Quantized, Filter #11: Reference, Filter #12: Quantized, Filter #12: Reference, Filter #13: Quantized, Filter #13: Reference, Filter #14: Quantized, Filter #14: Reference, Filter #15: Quantized, Filter #15: Reference, Filter #16: Quantized, Filter #16: Reference, Filter #17: Quantized, Filter #17: Reference, Filter #18: Quantized, Filter #18: Reference, Filter #19: Quantized, Filter #19: Reference, Filter #20: Quantized, Filter #20: Reference, Filter #21: Quantized, Filter #21: Reference, Filter #22: Quantized, Filter #22: Reference, Filter #23: Quantized, Filter #23: Reference, Filter #24: Quantized, Filter #24: Reference.

Сгенерируйте HDL для банка фильтров и испытательных стендов

Сгенерируйте HDL для каждого из 24 фильтров первого порядка и испытательных стендов, чтобы проверить каждый проект. Целевой язык здесь - Verilog.

Используйте методы canonic sign-digit (CSD), чтобы избежать использования умножителей в проекте. Задайте это с помощью пары значение-свойство 'CoeffMultipliers', 'CSD'. Поскольку результаты использования этой оптимизации не всегда численно идентичны регулярному умножению, которое приводит к переполнению, установите свойство испытательного стенда 'ErrorMargin' в 1 бит допустимой ошибки.

Создайте пользовательский стимул, чтобы проиллюстрировать коэффициент усиления фильтров путем генерации половины цикла тонального сигнала 20 Гц и 250 циклов тонального сигнала 10 кГц. Используйте низкочастотный тон для фильтров ускорения/разрезания басов и высокой частоты тон для фильтров повышения/разрезания treble.

Создайте временную рабочую директорию.

Чтобы сгенерировать код VHDL, измените свойство 'TargetLanguage' с 'Verilog' на 'VHDL'.

bassuserstim = sin(2*pi*20/Fs*(0:Fs/40));
trebuserstim = sin(2*pi*10000/Fs*(0:Fs/40));
workingdir   = tempname;

for n = 1:Nfilters/2
  generatehdl(quantizedfilterbank{n},...
              'Name', ['tonecontrol', num2str(n)],...
              'TargetDirectory', workingdir,...
              'InputDataType', numerictype(1,16,15),...
              'TargetLanguage', 'Verilog',...
              'CoeffMultipliers','CSD', ...
              'GenerateHDLTestbench','on', ...
              'TestBenchUserStimulus', bassuserstim, ...
              'ErrorMargin', 1);           
end
### Starting Verilog code generation process for filter: tonecontrol1
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol1.v
### Starting generation of tonecontrol1 Verilog module
### Starting generation of tonecontrol1 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol1
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol1_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol2
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol2.v
### Starting generation of tonecontrol2 Verilog module
### Starting generation of tonecontrol2 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol2
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol2_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol3
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol3.v
### Starting generation of tonecontrol3 Verilog module
### Starting generation of tonecontrol3 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol3
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol3_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol4
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol4.v
### Starting generation of tonecontrol4 Verilog module
### Starting generation of tonecontrol4 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol4
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol4_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol5
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol5.v
### Starting generation of tonecontrol5 Verilog module
### Starting generation of tonecontrol5 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol5
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol5_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol6
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol6.v
### Starting generation of tonecontrol6 Verilog module
### Starting generation of tonecontrol6 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol6
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol6_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol7
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol7.v
### Starting generation of tonecontrol7 Verilog module
### Starting generation of tonecontrol7 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol7
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol7_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol8
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol8.v
### Starting generation of tonecontrol8 Verilog module
### Starting generation of tonecontrol8 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol8
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol8_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol9
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol9.v
### Starting generation of tonecontrol9 Verilog module
### Starting generation of tonecontrol9 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol9
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol9_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol10
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol10.v
### Starting generation of tonecontrol10 Verilog module
### Starting generation of tonecontrol10 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol10
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol10_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol11
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol11.v
### Starting generation of tonecontrol11 Verilog module
### Starting generation of tonecontrol11 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol11
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol11_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol12
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol12.v
### Starting generation of tonecontrol12 Verilog module
### Starting generation of tonecontrol12 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol12
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol12_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
for n = Nfilters/2+1:Nfilters
  generatehdl(quantizedfilterbank{n},...
              'Name', ['tonecontrol', num2str(n)],...
              'TargetDirectory', workingdir,...
              'InputDataType', numerictype(1,16,15),...
              'TargetLanguage', 'Verilog',...
              'CoeffMultipliers','CSD', ...
              'GenerateHDLTestbench','on', ...
              'TestBenchUserStimulus', bassuserstim, ...
              'ErrorMargin', 1);
end
### Starting Verilog code generation process for filter: tonecontrol13
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol13.v
### Starting generation of tonecontrol13 Verilog module
### Starting generation of tonecontrol13 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol13
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol13_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol14
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol14.v
### Starting generation of tonecontrol14 Verilog module
### Starting generation of tonecontrol14 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol14
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol14_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol15
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol15.v
### Starting generation of tonecontrol15 Verilog module
### Starting generation of tonecontrol15 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol15
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol15_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol16
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol16.v
### Starting generation of tonecontrol16 Verilog module
### Starting generation of tonecontrol16 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol16
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol16_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol17
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol17.v
### Starting generation of tonecontrol17 Verilog module
### Starting generation of tonecontrol17 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol17
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol17_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol18
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol18.v
### Starting generation of tonecontrol18 Verilog module
### Starting generation of tonecontrol18 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol18
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol18_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol19
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol19.v
### Starting generation of tonecontrol19 Verilog module
### Starting generation of tonecontrol19 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol19
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol19_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol20
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol20.v
### Starting generation of tonecontrol20 Verilog module
### Starting generation of tonecontrol20 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol20
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol20_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol21
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol21.v
### Starting generation of tonecontrol21 Verilog module
### Starting generation of tonecontrol21 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol21
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol21_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol22
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol22.v
### Starting generation of tonecontrol22 Verilog module
### Starting generation of tonecontrol22 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol22
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol22_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol23
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol23.v
### Starting generation of tonecontrol23 Verilog module
### Starting generation of tonecontrol23 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol23
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol23_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
### Starting Verilog code generation process for filter: tonecontrol24
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol24.v
### Starting generation of tonecontrol24 Verilog module
### Starting generation of tonecontrol24 Verilog module body
### First-order section, # 1
### Successful completion of Verilog code generation process for filter: tonecontrol24
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1103 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpe4874c4f_f00a_4347_bdcc_6629ef456c35/tonecontrol24_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.

Результаты моделирования ModelSim ®

На следующем отображении показан симулятор ModelSim ® HDL, запускающий эти испытательные стенды.

Басовый ответ на тональный сигнал 20 Гц:

Ответ Treble на тон 10 кГц:

Заключение

Вы разработали банк фильтров с двойной точностью басов и treble boost/cut первого порядка фильтров непосредственно с помощью билинейного преобразования. Затем вы использовали коэффициенты фильтра, чтобы создать банк квантованных фильтров с 16-битными входами CD-качества и 18-битными выходами. После проверки отклика квантованных фильтров вы сгенерировали код Verilog для каждого фильтра в банке фильтров вместе с испытательным стендом Verilog, который использовал пользовательский входной стимул для фильтров bass и treble.

Чтобы завершить решение предоставления управления тональными сигналами в аудиосистему, можно добавить cross-fader к выходам каждой секции банка фильтров. Эти кросс-фэдеры должны взять несколько шаги расчета, чтобы плавно переключаться с одного шага повышения или среза на следующий.

Использование полного банка фильтров - это только один подход к решению этого типа задачи. Другой подход заключался бы в использовании двух фильтров для каждой полосы (bass и treble) с программируемыми коэффициентами, которые могут быть изменены под управлением программного обеспечения. Один из двух фильтров будет текущим, другой будет следующим. Когда вы регулировали элементы управления тональным сигналом, программное обеспечение было бы ping-pong между фильтрами, обмениваясь током, и следующим с простым fader. Компромисс заключается в том, что группа фильтров с постоянными коэффициентами, показанная выше, не использует умножителей, в то время как, казалось бы, более простая схема ping-pong требует нескольких умножителей.