Посты

Функции форматированного ввода/вывода: printf и scanf

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

Но всё это реализовано уже очень давно. Страшно сказать, но функция printf празднует в следующем году 50-летний юбилей! Да этих функций и не могло не быть — на заре развития компьютеров и компиляторов единственным средством общения программы с человеком был текстовый ввод-вывод.

Эти функции лежат в библиотеке stdio, подключим её:

#include "stdio.h"

Сжать сжиматель: codec2 + miniz

Кодек codec2, про который я писал недавно, обладает одной приятной особенностью: он прекрасно сжимается архиватором! Это может показаться странным, но похоже что код на его выходе имеет высокую степень похожести, которая даёт архиватору простор для выделения повторяющихся элементов.

Я обнаружил это, когда просто из любопытства попытался сжать полученный в прошлой статье *.c2-файл стандартным линуксовым gzip:

voice.c2 — 2448 байт (2.04 сек * 1200 байт/сек)

voice.c2.gz — 461 байт

Очень сильное сжатие, более 5 раз! Итоговый битрейт добрался до умопомрачительных 225 байт/сек. Я был так удивлён, что быстрей побежал реализовывать это сам.

Я использую стандартный метод DEFLATE, который реализован в библиотеке miniz. Но есть один ньюанс: нам необходимо сохранить «поточность» кодека. Я собираюсь использовать кодек для сжатия голоса, передачи его и воспроизведения в реальном времени, значит я не могу дожидаться окончания записи всего сигнала, и только потом сжимать. Нужно научиться сжимать данные так же потоково.

Иностранные блоги по электронике

Англоязычные блоги и сайты, посвящённые электронике. На многие из них я стараюсь заходить хотя бы раз в неделю.

Известнейшие инженеры-видеоблоггеры

http://www.eevblog.com/

http://chrisgammell.com/

**Чуть менее известные, но тоже крутые Electronic Engineers:

** http://scanlime.org/

http://elm-chan.org/**

**

**Youtube-каналы

** http://www.youtube.com/user/ContourCorsets

http://www.youtube.com/user/mikeselectricstuff

http://www.youtube.com/user/mjlorton

http://www.youtube.com/user/jeriellsworth

http://www.youtube.com/user/HiTestingTV

**Новостные порталы

** http://talkingelectronics.com/

http://www.electronicsweekly.com/

Home

И всё остальное:

http://www.fromorbit.com/

http://gerrysweeney.com/

http://hackedgadgets.com/

http://www.ianjohnston.com/

http://www.neufeld.newton.ks.us/electronics/

http://mightyohm.com/blog/

http://thesignalpath.com/blogs/

http://tronixstuff.wordpress.com/

http://www.vk2zay.net/

http://fourwalledcubicle.com/blog/

http://www.sparkfun.com/

http://makezine.com/blog/

http://blog.ioactive.com/

http://www.eeweb.com/

http://www.bunniestudios.com/blog/

Blog

http://electronicdesign.com/blogs

http://www.engineeringtv.com/

http://electronics-lab.ru/

Сжатие голоса — гласные звуки

Чем меньше битрейт потока данных, тем дальше можно его передать. Если получится сжать голос до 1-2 кБ/с, можно будет общаться на расстоянии до 25км (с использованием трансивера CC1125). Давайте попробуем разработать голосовой кодек самостоятельно, без использования готовых решений вроде codec2.

Как устроен голос? В нём можно выделить несколько элементов:

  • гласные звуки
  • согласные — шумовые — взрывные: п, к, т…
  • согласные — шумовые — фрикативные/свистящие: с, ш, щ, ф, в…
  • согласные — сонорные — дрожащие: р
  • согласные — сонорные — носовые: м, н

Гласные звуки можно рассматривать как музыкальные — это чистый тон + его обертоны различной амплитуды. Согласные звуки — это шумовые звуки с разным тембром и сонорные (тон + шум).

Гласные и согласные здорово различаются по своей информативности, сравните:

гласные: .и..ио.ы .и..ио.ы .и..ио.ы а.ы. .о.

согласные: м.лл..н. м.лл..н. м.лл..н. .л.х р.з

Ирония заключается в том, что гласные звуки очень легко описать небольшим набором параметров. В них нет частот, некратных частоте основного тона, поэтому всё описание сводится до нескольких значений: частота основного тона + амплитуды гармоник. Причём частота доминанты должна быть измерена точно (с точностью до 16 бит), а вот амплитуды гармоник терпят и очень сильную децимацию — поэтому каждую амплитуду можно сжать до 1 байта или даже полубайта.

Давайте начнём с гласных, раз уж их так легко описать. Я разрабатывал алгоритм на Питоне, просто потому что в нём это реально быстро и просто.

Использование codec2 для сжатия звука

Кодек codec2, про который я писал в одном из прошлых постов, предоставляет удобное API для потокового сжатия звука. Я написал простую тестовую программу для демонстрации его использования в реальной жизни.

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