Аудио SSTC с сигма-дельта модулятором

А что мы делаем?
Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 07 янв 2016, 12:32

По мотивам теслы mutabor'а захотелось и мне сделать сстц с сигма-дельта модуляцией. Естественно, это будет долгострой, так как времечка у меня всегда не хватает, но интересно жеж разобраться в тонне математики. Возможно, и вам будет интересно, поэтому буду сюда отписываться о прогрессе.

Естественно, первое с чего я начал - это сам модулятор. Если кратко, то весь цимус сигма-дельта модуляторов (по сравнению с ШИМом) в том, что можно отдельно управлять АЧХ сигнала и АЧХ шума, и, таким образом, вытеснить шум в область ультразвука, где его никто и не услышит. Чем больеш порядок модулятора - тем больше можно вытеснить шум в ультразвук, но тем нестабильнее сам моделятор. При любом неловком движении модулятор высокого порядка превращается в генератор.

Сначала я попробовал сделать подулятор первого порядка, чтобы было с чем сравнивать.
m1.gif
m1.gif (8.71 КБ) 10726 просмотров


Звучит он довольно отвратно. Естественно, модулятор был модифицирован до второго порядка:

m2.gif
m2.gif (11.44 КБ) 10726 просмотров

Звучит он уже намного лучше, но, все-равно, шумит довольно сильно.

Небольшими усилиями воли, модулятор разросття до третьего порядка. В этот раз в более общей форме и с управляемым нулем в передаточной характериситке шума:
m3.gif

Шума этого модулятора уже практически не сылшно, поэтому он и сойдет за рабочий вариант. Вот, к примеру, спектр выходного сигнала этого модулятора при подаче на выход 1кгц:
sp.gif

Видно и ноль в шуме и, что даже на 20кгц сохраняется 50dB сигнал/шум. Не аудиофильски, конечно, но, на практике, его не слышно.

Сделать его в аналоге уже довольно сложно, да и не интересно, поэтому это все я постараюсь впихнуть в свою старую любимую плис xc3s50an. К сожалению, в ней не хватает ресурсов чтобы сделать все "в лоб", поэтому нам с вами предстоит увлекательное создание специализированного процессора под эту задачу.

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 08 янв 2016, 14:55

Итаксь, набросал процессор для этого проектика. Задача процессора, фактически, умножать и складывать, используя при этом поменьше аппаратных ресурсов и делая это как можно быстрее, поэтмоу он получился доволньо простой.

Работает он с числами с фиксированной запятой 0q31. К примеру, интегратор на нем, выглядит вот так:

Код: Выделить всё

   in 0x00
   lda 0x00
   ldb 0x01
   nop
   stradd 0x01
   done


nop тут для того, чтобы успела завершиться предыдущая комманда. В таких глубокоэмбеддед штуках часто проще сделать вот такие хаки, чем выдумывать синхронизацию. Но и этот мелкий процессор забил 60% плисины (естественно, их забил не сам процессор, а умножитель). Если кому интересно, вот полный код:

 Код

Код: Выделить всё

module processor(
   input clk,
   input start,
   input [31:0] sample,
   output reg on
   );

// instruction regs
parameter O_DONE = 0;
parameter O_LDA =  1;
parameter O_LDB =  2;
parameter O_STRMUL = 3;
parameter O_STRADD = 4;
parameter O_STRSIGN = 5;
parameter O_IN  = 6;
parameter O_OUT = 7;
parameter O_NOP = 8;

reg [3:0]   opcode;
reg [3:0]   opcode2;
reg [7:0]   instruction_address;
wire [31:0] instruction_output;



wire signed [31:0] data_output;
reg started;

reg [31:0] operand_a;
reg [31:0] operand_b;
reg [7:0]  operand_addr;

reg [31:0] write_data;
reg write_enable;

wire [31:0] multiplied;
wire [31:0] added = operand_a + operand_b;
wire [31:0] sign = operand_a >= 0 ? 32'h7fffffff : 32'h80000000;
multiplier multiplier1 (
   .clk(clk),
   .a(operand_a),
   .b(operand_b),
   .p(multiplied)
);


processor_memory processor_memory1 (
  .clka(clk),
  .ena(1),
  .wea(write_enable),
  .addra({1'b0, operand_addr}),
  .dina(write_data),
  .douta(data_output),
  .clkb(clk),
  .enb(1'b1),
  .web(0),
  .addrb({1'b1, instruction_address}),
  .dinb(0),
  .doutb(instruction_output)
);



always @(*) begin
   opcode <= instruction_output[31:28];
   operand_addr <= instruction_output[27:20];
   
   case(opcode)
      O_STRMUL: begin
         write_data <= multiplied;
         write_enable <= 1'b1;
         end
         
      O_STRADD: begin
         write_data <= added;
         write_enable <= 1'b1;
         end

      O_STRSIGN: begin
         write_data <= sign;
         write_enable <= 1'b1;
         end         
         
      O_IN: begin
         write_data <= sample;   
         write_enable <= 1'b1;
         end
         
      default: begin
         write_data <= 0;   
         write_enable <= 1'b0;
      end
   endcase
end


always @(posedge clk) begin

   opcode2 <= opcode;
   case(opcode2)
      O_LDA: begin
         operand_a <= data_output;
         started <= 1;
         end
   
      O_LDB:
         operand_b <= data_output;

      O_OUT: begin
         on <= data_output > 0;
         end

      O_DONE: begin
            started <= 0;
            instruction_address <= 0;
         end

   endcase

   if (started) instruction_address <= instruction_address + 1;   
   if (start) started <= 1;
   
   
end


initial begin
   instruction_address = 0;
   write_enable = 0;
end


endmodule


Теперь нужно написать хотябы простой модулятор для этого проца, попутно его обезбаживая

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 10 янв 2016, 00:29

После небольшего ковыряния с процессором оказалось, что он не успевает все посчитать, поэтому переписал я на жесткую логику и все работает нормально. Добился совпадения сигналов с моделью. Теперь нужно бы написать приемник аудиосигнала.

waves.png

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 11 янв 2016, 14:00

Написал приемник spdiff, он-же toslink и прицепил к нему модулятор. Пришлось немного поиграться, так как это все никак не хотело запускаться как в симуляторе. В итоге, оно заработало. Не так хорошо, как предсказывал симулинк, но заработало. Вот видео :)


Firelander
Сообщения: 68

Сообщение Firelander » 11 янв 2016, 18:31

Качество вполне себе :)
То есть по сути на выходе мы получаем сигнал включена или нет тесла в данном периоде, эдакий высокочастотный интерраптер, я правильно понимаю?
Если так, то на ум сразу приходит условный компаратор, который сравнивает ток вторички с аналоговым аудиосигналом.
Ех, а у меня без дела валяется coreEP4CE10.
Короче было бы здорово, если б ты сделал видео, где на пальцах объясняешь как работает сигмадельта. Статейки я почитал, картина немного-немного начала вырисовываться, но далеко не всё понятно, например как поток нулей и единиц на выходе магическим образом преобразуется в число. Это я про АЦП. Не совсем про твою схему, конечно.
Хотелось бы узнать о преимуществах схемы по сравнению с компаратором. В сигмадельте используется виртуальное интегрированное значение, коэффециентами подстраиваются скорости нарастания/затухания, как я понимаю, а тут можно считать реальный ток. Если я совсем уж чушь говорю, ткни носом, а)

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 11 янв 2016, 19:18

эдакий высокочастотный интерраптер, я правильно понимаю?

Именно так :)

Если так, то на ум сразу приходит компаратор, который сравнивает ток вторички с аналоговым аудиосигналом.

Скорее-всего, такая штуковина возбудится из-за двух полюсов в обратной связи. Плюс ток померять с достаточной для аудио точносью в тесле не так то просто. Это не токовая защита. Тут-же, все обратные связи внути и в цифре, что гарантирует их стабильность. Кроме того, сама передаточная характеристика огибающей теслы тут сыграет как ФНЧ, что еще улучшит сигнал/шум.

coreEP4CE10, да, это монстрячая штуковина по сравнению с тем, что у меня тут, но у меня эта платка уже есть, плюс она заточена под теслы, так-что пришлось впихиваться в нее.

mutabor
Сообщения: 91

Сообщение mutabor » 20 янв 2016, 12:28

2 BSVi: Интересные картинки, но многое не понятно, вот например: ты из однобитного формата (в симуляшке) делаешь многобитный, это FIR фильтр с дециматором делают? Какая у тебя частота на выходе модулятора и после дециматора, и сколько фактически бит на один отсчет получается в итоге?
И еще гдето читал, что модуляторы выше второго порядка в тех же АЦП не используется, т.к они потенциально неустойчивы.

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 20 янв 2016, 16:34

ты из однобитного формата (в симуляшке) делаешь многобитный, это FIR фильтр с дециматором делают?

ага.

Какая у тебя частота на выходе модулятора и после дециматора, и сколько фактически бит на один отсчет получается в итоге?

После модулятора 500кгц, после дециматора 45кГц.

И еще гдето читал, что модуляторы выше второго порядка в тех же АЦП не используется, т.к они потенциально неустойчивы.

Даже второй порядок не устойчив если его в лоб делать. Тут нужно немного магии с математикой и можно стабилизировать все. В промышленных применениях есть модуляторы до 5того порядка если в лоб и есть еще топологии, где ошибка последнего бита не загоняется в обратную связь, там вообще порядок может быть какой угодно. Но тут это все избыточно :)

Сейчас проектик остановился на том, что мне нужно сделать PLL и, собственно, саму теслу :)

mutabor
Сообщения: 91

Сообщение mutabor » 21 янв 2016, 09:37

М-мм, а PLL то зачем? :o
Ааа..кажись догадался - чтобы не мучиться с синхронизацией при слабом сигнале? Ну да, у меня была такая проблема - после долгого перерыва между импульсами следующая пачка идет с рассинхроном по фазе, правда это было только с ШИМом (он у меня на частоте 22кГц был) + после 3-5 импульсов синхронизация восстанавливалась. Более того, у ФАПЧи тоже будет эта проблема. И кстати, все равно придется постоянно вкачивать некоторую среднюю мощность в пушистик -почему это так я приводил ссылку на обсуждение с математиками электроникса, вывод был такой: чтобы звуковые колебания создаваемые кустиком были без искажений нужно постоянно иметь кустик как можно большего объема, который модулируется на небольшой процент от этого объема. При этом сигнал ОС с катушки будет достаточно мощным, чтобы и тактировать модулятор, и управлять драйвером.
С другой стороны имея плисину грех не попробовать сделать на ней цифровой ФАПЧ :)

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 21 янв 2016, 22:58

Да, PLL для того, чтобы это все не заглохло при низких скважностях. Но, действительно, судя по всему, работало бы и без него, но уже, хоть коряво, но написал. Силовуха пока очень слабенькая, но уже что-то работает:


mutabor
Сообщения: 91

Сообщение mutabor » 21 янв 2016, 23:42

Прикольно такой маленький пуфыстик, а играет бойко :D
Кстати еще можно как посмотреть на результат работы -щуп положить рядом и длительность развертки сделать 500мкс/дел. или около того -будет видно огибающую несущей (сам аудиосигнал)

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 21 янв 2016, 23:47

будет видно огибающую несущей (сам аудиосигнал)

Не будет, будет просто сплошная колбаса.

Попробовал мегагерц. Силовая не тянет :(

mutabor
Сообщения: 91

Сообщение mutabor » 22 янв 2016, 09:05

Значит глубина модуляции маленькая, у меня хорошо просматривалось. Кстати я еще вместо аудио выводил чисто синус, на макс.амплитуде хорошо видно когда упирается в ограничение, ну и вообще искажения можно сразу увидеть. Но по-любому играет она именно за счет АМ :)

:shock: Кстати идея, если уж ты будешь делать цифровой ФАПЧ, может попробовать ЧМ модуляцию реализовать? Идея в следующем (не знаю как реализуется цифровой ФАПЧ, расскажу на примере аналогового, но думаю ты поймешь идею) в аналоговом ФАПЧе есть фазовый детектор и фильтр, с выхода которого сигнал заводится на ГУН, так вот если к этому сигналу приплюсовать некий внешний сигнал, то он будет модулировать генератор по частоте. Получим ЧМ модуляцию. Но посколько катушка это резонансный контур, отклонение от резонансной частоты будет модулировать и амплитуду (что нам и нужно). Только для получения более-менее качественного АМ нужно работать не на самом резонансе, а немного в стороне от него -чтобы в одну сторону сигнал нарастал, а в другую убывал. 8-) Плюс идеи в том, что тогда можно будет просто выкинуть сигма-дельта модулятор :lol:

Аватара пользователя
iEugene0x7CA
Адепт
Сообщения: 638
Откуда: Киев

Сообщение iEugene0x7CA » 22 янв 2016, 18:33

mutabor писал(а):Кстати идея, если уж ты будешь делать цифровой ФАПЧ, может попробовать ЧМ модуляцию реализовать? Идея в следующем (не знаю как реализуется цифровой ФАПЧ, расскажу на примере аналогового, но думаю ты поймешь идею) в аналоговом ФАПЧе есть фазовый детектор и фильтр, с выхода которого сигнал заводится на ГУН, так вот если к этому сигналу приплюсовать некий внешний сигнал, то он будет модулировать генератор по частоте. Получим ЧМ модуляцию. Но посколько катушка это резонансный контур, отклонение от резонансной частоты будет модулировать и амплитуду (что нам и нужно). Только для получения более-менее качественного АМ нужно работать не на самом резонансе, а немного в стороне от него -чтобы в одну сторону сигнал нарастал, а в другую убывал. 8-) Плюс идеи в том, что тогда можно будет просто выкинуть сигма-дельта модулятор :lol:

Игрался с 4046 микросхемкой, а? ;)
На самом деле у подобного решения не мало минусов:
1. Косвенная AM модуляция через FM не особо эффективна, и как следствие — звук получается паршивым, как со старого радио;
2. Работая вне резонанса теряется эффект ZCS, а это значительные потери КПД.
Пропуск импульсов с синхронизацией ОС этот эффект сохраняет, а сигма-дельта — лишь более эффективное по сравнению с ШИМ решение.
PLL'ка тоже не лишняя, она не даст катушке заглохнуть в результате внешних воздействий или угасания стримера из-за модуляции.
По сути проект чересчур сложен, с этим не поспорю. Однако в нём всё сделано т.с. по-правильному. Идей как сделать ещё круче у меня лично нет. :mrgreen:

mutabor
Сообщения: 91

Сообщение mutabor » 22 янв 2016, 20:46

iEugene0x7CA писал(а):Игрался с 4046 микросхемкой, а? ;)
На самом деле у подобного решения не мало минусов:
1. Косвенная AM модуляция через FM не особо эффективна, и как следствие — звук получается паршивым, как со старого радио;
2. Работая вне резонанса теряется эффект ZCS, а это значительные потери КПД.
Пропуск импульсов с синхронизацией ОС этот эффект сохраняет, а сигма-дельта — лишь более эффективное по сравнению с ШИМ решение.
PLL'ка тоже не лишняя, она не даст катушке заглохнуть в результате внешних воздействий или угасания стримера из-за модуляции.
По сути проект чересчур сложен, с этим не поспорю. Однако в нём всё сделано т.с. по-правильному. Идей как сделать ещё круче у меня лично нет. :mrgreen:

Было дело ;) Правда тогда я еще мало понимал, сейчас -гораздо лучше :)
Еслибы я знал ПЛИСКИ я бы сам чтото такое попробовал, хоть я и аналоговик, но в цифре гораздо интереснее реализовывать идеи - не мешают никакие наводки и особенности аналоговой схемы, и ктобы не повторил cхему и алгоритм -работать будет точно также, и с математической точностью 8-)
По поводу замечаний -оно как бы да, но всё же...Сильно ли будет уходить схема от ZCS? Да не особо, тут сильно менять амплитуду не надо, да и чем дальше отойдет от резонанса, тем и ток ниже, поэтому нагрев думаю не особо увеличится. Ну а насчет низкой эффективности АМ -наверно да, линейность там не супер, возможно будут искажения. Но в любом случае если эту фишку можно реализовать попутно, то почему бы не проверить этот вариант? ;)

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 23 янв 2016, 13:44

Сделать такую штуку можно, но сейчас у меня не классическая PLL, а, скорее, random walk filter, поэтому как-нибуть попозже. Кроме того, глубокой модуляции на одном контуре дя еще и с переменной добротностью не получить, как мне кажется. Мне интересно сделать именно классическую AM, а не FM, детектируемую контуром.

Сейчас мне кажется, что лучше попробовать многобитный сигма-дельта модулятор. Это типа ШИМа, но последний бит ШИМа модулируется как сигма-дельта.

К примеру, у нас частота 500кГц. Частота ПЛИС, к примеру, 100МГц. В период влезает 100 отсчетов, что соответствует 6.6 бита или 40дБ С/Ш. Дальше прибавляем СД модулятор второго порядка, но прибавляет еще 30дб, итого получается 70дб, что уже эквивалентно 12 битам. На самом деле, можно затактировать отдельно ШИМ-модулятор и поднять частоту до ~200МГц в моей плисинке, что добавит еще 6дб. Тоесть из этой системы можно добиться примерно 78дб. На видео, для сравнения, примерно 30дб.

mutabor
Сообщения: 91

Сообщение mutabor » 23 янв 2016, 15:16

Т.е ты хочешь делать частоту ШИМ равную частоте вторички? Не пугают жесткие переключения?

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 24 янв 2016, 13:03

Т.е ты хочешь делать частоту ШИМ равную частоте вторички?

Ага

Не пугают жесткие переключения?

Если они контроллируемые, чего их бояться то. Больше пугает передача переменной скважности через GDT. Хотя, можно читерить и использовать фэйзшифтинг вместо ШИМ.

mutabor
Сообщения: 91

Сообщение mutabor » 24 янв 2016, 19:16

Форма импульсов какая -трехуровневая манипуляция (короткий в плюс, потом ноль до следующего полупериода и короткий в минус)? Мы такую использовали както, как раз для управления полумостом через транс. Ферриты были обычные Н2000, вроде проблем не было, хотя давно это было...

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 12 фев 2016, 19:50

Итак, сделал первый эксперемент. Оно вполне себе работает, но слышны искажения и шумит тесла доволньо сильно. Шум, очевидно, связан с низкой рабочей частотой. А вот искажения, как я и предпологал, с формой синусоиды.


koch
Сообщения: 45
Откуда: Томск

Сообщение koch » 14 фев 2016, 10:45

Сергей, поясни пожалуйста по второму рисунку с точки зрения мат анализа. На первом ты берешь интеграл от sin x dx. Т.е. sin это рабочая частота самой катушки (резонансная). Вторая картинка несовсем понятна.
PS как работает дельта сигма модулятор в курсе, с математической стороны не совсем.

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 14 фев 2016, 12:28

по какому из вторых рисунков?

koch
Сообщения: 45
Откуда: Томск

Сообщение koch » 14 фев 2016, 14:10

На последнем видео, 2:12 минуте.

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 14 фев 2016, 14:38

Вторая картинка - это зависимость площади под синусоидой от длинны куска синусоиды, который мы отрезаем. Площадь под функцией равна интегралу этой функции.

Аватара пользователя
BSVi
Адепт
Сообщения: 3224
Откуда: Киев

Сообщение BSVi » 24 фев 2016, 22:56

Сделал катушку на 2МГц. Чесно-говоря, я разочарован. Шипит она так-же, как и на 500кГц, а усититель E-класса модулируется сигнма-дельта модулятором отвратно. Это и понятно - ему нужно много циклов, чтобы получился стационарный E-классный режим. Поэтому, нельзя так просто брать и выбрасывать импульсы накачки. Похоже, нормально модулировать его можно только аналоговым образом, как это и делают другие ребята, которые работали над аудиотеслами.
Вложения
kacher.jpg

Вернуться в «Наши проекты»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость