Wednesday, 12 November 2008

Comparing 2 Audio (*.wav) Files

We already know the structure of wave file and thus we are able to read it byte by byte (actually we need to read the data chunk sample by sample). Now the next move is to get "fingerprints" from our files.

Fingerprint

A fingerprint can uniquely and compactly represent an audio file. It consists of several points of local energy maximum in audio spectral density. How the spectral density varies in time can be shown by a spectrogram. The most common format is a graph with two geometric dimensions: the horizontal axis represents time, the vertical axis is frequency; a third dimension indicating the amplitude of a particular frequency at a particular time is represented by the intensity or colour of each point in the image, e.g., the brighter the shade, the more energy is contained in the time-frequency point. The only thing we need is a amount of acoustic energy in predefined frequency and time.

A spectrogram of 30 seconds of the part of Pet Shop Boys "West End Girls" song starting from 1:00

Spectrograms can be obtained by Short Time Fourier Transform. The audio samples are grouped into analysis time windows (preferably overlapping) wi of equal length N, with wi denoting the i-th window. For each window the Fourier transform is calculated, giving a complex vector vi = STFT(wi) of the same length as the window. Because in this case the input given to the Fourier transform always are vectors of real numbers, the output complex vectors obey the symmetry:

vi[q] == -vi[N-q+1]

So the complete information is contained in the first N/2 components of the complex vector vi.

The Fourier transform decomposes the signal given by the samples inside each input window in terms of sine waves of discrete frequencies. These frequencies are integer multiples of the fundamental frequency which is determined by the window length N and the sampling rate S of the waveform representation. The frequency Fk for a particular index k in the complex vector may be calculated by using the following formula:

Fk = k * S / N , where k = 0, ... ,N/2

The first frequency F0 is always zero. If we have a sampling rate of 44100 Hz and a window length of 1024 samples, the base frequency F1 is 43.0664 Hz and the maximum frequency F512 is the Nyquist rate 22050 Hz.

Then we need the absolute value for each component of vk to get a measure of how strongly a discrete frequency Fk is present in the decomposition of the i-th window of audio file. This data can then be used for plotting the spectrogram. When the spectrogram is plotted the fingerprint points are chosen to be points that are local maximum within regions of fixed size surrounding the point. Larger region size leads to fewer but possibly more significant points. The resulting features are saved as pairs of integer numbers (i, k) with i being the window index and k being the frequency index.

Friday, 7 November 2008

Structure Of *.wav Audio Files

Wave file structure is very simple. The structure can be divided into 3 parts (chunks).

First chunk: The first 4 bytes should be "RIFF". Then come 4 bytes, which indicate the size of file. Then comes "WAVE".

Second chunk: It starts with "fmt ". Then come 4 bytes showing the length of "fmt " chunk. Then come audio format, number of channels, sample rate, Byterate, Block align and bits ber sample.

Third chunk: It is the audio data itself. As always 4 first bytes - name of the chunk. 4 bytes after that - the length of the chunk in bytes. After that come samples itself. 2 * number_of_channels bytes each sample.

There can be also other chunks between the first and the third, but they are really not widely used. If you got interested in it, a very good article about "Wave file format" is on The Sonic Spot.

So we have here an example. We see the first chunk (purple). It shows the length of the file - 0x(00 00 08 24) = 0x824 = 2084

Bytes should be read in reverse direction. First read byte has the smallest rank!

You can check yourself: left channel sample #5 = 0xE734 and right one is 0xA623.


Continued there...

Going to English

I decided to continue writing here in English. So I can be read by much more audience. I hope my English is as good as my native language. Will see if it works so. :)

Wednesday, 3 September 2008

Install Ubuntu 8.04 on Asus Eee PC 1000h

Приобрёл себе Asus Eee Pc 1000H. Установленный там Xandros что-то не очень вдохновил, поэтому решил поставить туда свою любимую Ubuntu. Что для этого нужно было сделать...

Создание загрузочной USB и установка Ubuntu.

Об создании загрузочной флэшки очень хорошо написано на официальном сайте Ubuntu. Я выбрал вариант с UNetbootin.

Загрузка и установка проблем вызвать не должна, поэтому детальное описание опускаю.

После установки

Не работает сеть (ни ethernet, ни wifi), некоторые комбинации клавиш (Fn+F2, Fn+F7, Fn+F8, Fn+F10/F11/F12 ), вебкамера.

Настройка сети

Самый простой способ на мой взгляд - это установка неофициального специального Ubuntu kernel, оптимизированного под Eee Pc.

Shortcuts

Шорткаты устанавливаются благодаря http://forum.eeeuser.com и его пользователю elmurato. Нужно скачать его скрипты и установить. К сожалению шорткаты начинают работать только после логина. Так что если вам надо отключить звук во время загрузки, у вас это получится только вставив наушники.

WebCam

BIOS. Onboard devices. WebCam Enabled.

Tuesday, 15 July 2008

Первые впечатления

Итак, делюсь первыпи впечатлениями, как ощущения после перехода с Ruby на C#. Пока всё, с чем я столкнулся, это неудобства:

Null class.
Отсутствие null как объекта. Затрудняет жизнь многочисленными провернками на null. Паттерн introduce null object не особо спасает. Писать для каждого класса нулевой объект не радует. Можно ли реализовать 1 общий класс, от которого всё наследуется?
System.Linq библиотека
Вроде бы удобная вещь, но! Она была нагло спислизана с ruby, причём сделано это очень криво. Зачем-то нужно было менять названия методов. Плюс были портированы не 1 в 1. В результате имеем:
Method alternatives
RubyC#
array.collectarray.select
array.selectarray.Where
array.detect ( = array.select.first )array.first
array.join( token )String.join(array, token)
Как видим, join метод стал вдруг методом String класса.
Много лишних слов
public overrride static void methodName() vs. def self.method_name
Консоль
Отсутствие консоли, где можно быстренько потестить какой-нибудь метод.

Или я просто предвзято отношусь к C# и Microsoft?

Friday, 11 July 2008

Моё рабочее место

Так как недавно только сменил работу, и в памяти ещё осталось прошлое рабочее место, то напишу про оба: прошлое и настоящее.

Прошлое:
Программировал на ruby on rails. Использовал:
ОС: Ubuntu.
С тех пор, как я пересел на неё, прошло уже 4 года (4.10 была первая версия, выпущена соответственно в октябре 2004 года). Понравилась с первого взгляда. Теперь её использую повсюду.
Программы:
Jedit
Просто лучший редактор для программирования. Главное уметь пользваться и правильно настроить плагины. И, конечно, abbreviations.
Plugins:
SideKick
Позволяет создавать и работать с проектом, а не набором файлов.
JDiff
Очень удобный диффер, ищет различия посимвольно. Можно настроить игнорирование нескольких подряд идущих пробелов.
RubyPlugin
Незаменимая вешь для работы с руби
RE Tester
Удобно тестить регулярные выражения прежде чем их писать в код
XSLT
При работе с XML. Позволяет тестить xPath.
trac
Очень удобный багтракер. Имеет встроенный вики (например, для спецификации и/или документации). Интегрируется с svn.
svn
Контроль версий обязателен :). Пока пользовал только svn, интересно попробовать Git
Firefox
А как же без него-то программирование для веб?
Plugins:
Firebug
Без него сейчас не обходится ни одна разработка под web
YSlow
Позволяет тестировать скорость загрузки страниц
Web Developer
Позволяет отключать некоторые элементы страницы. Опять же нужен для тестирования
Console2
Этим пока не пользовался, но поставил на всякий случай. Изучаю...
Настоящее:
Программирую на C#, asp.Net. Использую всё те же Firefox, JEdit, плюс:
ОС: Windows
Что и следовало ожидать :). Очень непривычно. Почему под убунту нельзя было? :)
Программы:
Visual Studio 2008
Вещь, конечно, на редкость глючная, но без неё никак.
ReSharper
Когда-то давно (в университете) использовал IntelliJIDEA для Java. Руки быстро вспомнили старые шорткаты :)
TotalCommander
Двупанельный файловый менеджер. Намного удобнее обычного эксплорера

Saturday, 31 May 2008

Проблемы с запуском графической части Ubuntu (gdm)

Проблема была в кратце такова, что при нормальной загрузке Ubuntu моментально подвисала, как только показывалось графическое окно login. В то же время, если сначала загрузиться в recovery mode, а потом запустить графическую оболочку (startx), то всё работало нормально.

Напрашивается вывод, что при recovery mode Ubuntu не загружает некоторые модули, которые возможно конфликтуют с gdm. Как это выяснить?

Прежде всего загружаемся в recovery mode и из-под roota выполняем команду sysvconfig Там весь список загружаемых модулей. Убираем на время gdm. Сохраняем, выходим. Теперь при нормальной загрузке, компьютер не будет виснуть и мы сможем посмотреть какие модули им загружены.

Теперь всё в той же root консоли набираем dmesg > /home/[ваш username]/failsafe.log что сохранит лог загрузки в файл.

Также устанавливаем хороший diff'ер apt-get install meld Теперь можем спокойно перезагрузиться в нормальном режиме.

Так как мы в самом начале отключили загрузку gdm, то после перезагрузки мы снова в консоли. Нужно залогиниться и выполнить аналогичную команду, чтоб записать лог загрузки. dmesg > /home/[ваш username]/normal.log

Осталось только сравнить эти два лога. Я использовал удобство gdm,- загрузился туда через recovery mode, сравнил через meld эти 2 файла (!! meld сравнивает посимвольно а не построчно, поэтому различия в начале строк, которые являются временем загрузки не сильно волновали !!). В файлах явно читались названия модулей подгружаемых при обычном старте и игнорируемых в recovery mode. У меня это были bluetooth и powernowd. Поэтому, снова запустив sysvconfig, отключил bluetooth, powernowd и powernowd.early, не забыл включить gdm и перезагрузился в нормальном режиме.

Теперь всё работает.

Friday, 30 May 2008

Вопросы, которые можно задать при устройстве на работу

В скором времени собираюсь переходить на новое место работы. Посмотрим, что из этого выйдет. На новом месте обещают привязанность к Microsoft. Используют практически все их технологии: .Net, Silverlight итд. Клепать сайты на Rails я уже научился :). Идём дальше...

В связи с вышесказанным, предлагаю сабж. Мне ими воспользоваться не посчастливилось - наткнулся уже после проведения собеседования.

  1. Сколько новых версий программ вы выпустили за последний год?
    • слишком мало = scope creep: wtf мэнеджмент
    • слишком много = или "супербыстрые" или количество > качество
  2. Почему ушёл человек, работавший до вас на этой должности?
    • уходит от ответа = что-то скрывает
    • он "ушёл" = почему так неопределённо?
    • конкретный ответ = похоже, что всё ок
  3. Случались ли катастрофы и как они были решены (хотя бы последняя)
    • пахали 2 недели = недостаточное DR-планирование (Disaster Recovery) или код (или персонал) WTF
    • 2 часа на поиск и устранение = полёт нормальный
  4. Как часто (в год) устраиваются тренинги для персонала?
    • < 1 недели = хотят использовать тебя, но не инвестировать в тебя
  5. Сколько обычно приходится перерабатывать?
    • редко = хорошо продуман проект и время / стабильный код
    • каждый день = плохое планирование, wtf код/персонал/управление
  6. Зависит от деятельности: Размер суппорта/менеджеров по продаже по отношению к программерам?
    • 100:1 = много клиентов: стабильный код
    • 1:10 - очень новый, может код нестабилен
    • вероятно, новый проект (вполне нормально)
  7. Как устроен DR?
    • "Колян из дома чинит всё" = никакого DR: валить!
    • "параллельные сервера, dbs, итд" = кто-то всё продумал и на это были выделены деньги
  8. Можно заглянуть в серверную?
    • как птичье гнездо = АХТУНГ!
    • компы на холодильнике с вентиляторами = валить!
    • чистенько и прилично = хорошая поддержка сети

Monday, 12 May 2008

Hobo for Rails 2

Пока я собирался попробовать это Хобо на вкус, они уже выпустили следущую версию. А пока времени на это нет вообще.

Monday, 4 February 2008

Hobo for Rails

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

Friday, 1 February 2008

Rails database table names: singular Vs. plural

Rails < 2.0 : You need to add into config/environment.rb file line
# Include your application configuration below
ActiveRecord::Base.pluralize_table_names = false #added line
Rails >= 2.0 : You need to add into config/environment.rb file inside block
Rails::Initializer.run do |config|
  config.active_record.pluralize_table_names = false #added line
end

Thursday, 31 January 2008

Install Ruby Gem Postgres In Ubuntu Linux

Installing ruby gem postgres in Ubuntu linux
sudo gem install postgres
gives the next error
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
  ERROR: Failed to build gem native extension.

ruby extconf.rb ins postgres
extconf.rb:46: command not found: pg_config --includedir
extconf.rb:53: command not found: pg_config --libdir
checking for main() in -lpq... no

Can be solved by:

sudo apt-get install libpq-dev
sudo gem install postgres-pr

Tuesday, 8 January 2008

Hello world!

Так уж повелось, что всё в этом мире начинается с Hello world!. Даже блоги. Вообще, так сказать, это первая тестовая попытка создать блог, имеющий какую-то конкретную специализацию. Опыт работы пока ещё небольшой (пара лет), поэтому некоторым мои открытия могут показаться уже давно известными и проверенными истинами. Однако, блог и создаётся главным образом для того, чтобы быстрее вырасти и набрать знаний и опыта. Первое время скорее всего буду делиться мыслями о Ruby и Rails. Просто последний мой проект написан именно на этом языке с использованием фрэймворка.