dlinyj: (Default)
[personal profile] dlinyj
Вообще, если бы была возможность работать с железом и ЦОСом (цифровой обработкой сигналов), то я был бы самым счастливые человеком на земле. Разумеется чтобы и не обижали рублём. Вот сейчас выпала такая возможность, пишу софт для тестирования звуковой карты под linux. В данном случае вопрос не снятия АЧХ, а быстро проверить - работает или нет.

Решение весьма простое: я генерирую звуковой файл, с тремя гармониками, длительностью несколько секунд. Затем проигрываю его, и снимаю со входов звуковой карты. После чего фурьячу его и смотрю, остались ли гармоники, какая громкость и т.п. Пока всё отлаживаю минуя железо, так сказать просто со звуковым файлом. Файл генерирую так:

	float amplitude = 16000;
	float freq_Hz = 100;
	/* fill buffer with a sine wave */
	for (i=0 ; i<размер_буфера; i++)
	{

		buffer[i] = (int)(amplitude/10 * sin((float)(2*M_PI*i*freq_Hz/S_RATE)));
		buffer[i] +=(int)(amplitude/20 * sin((float)(2*M_PI*i*10*freq_Hz/S_RATE)));
		buffer[i] +=(int)(amplitude * sin((float)(2*M_PI*i*100*freq_Hz/S_RATE)));
	}
	write_wav("test.wav", размер_буфера, buffer, S_RATE);


Обращаю внимание, что базовая амплитуда у нас равна 16 000, первая гармоника равна 1/10 основной амплитуды и составляет 1600 у.е. с частотой 100 Гц, вторая гармоника равна 1/20 основной амплитуды и равна 800 у.е. с частотой 1000 Гц, третья равна амплитуде = 16000 у.е. и частота равна 10 000 Гц.
Можно поглядеть полученный спектр программой Audacity


Спектр такой как должен быть


Немного помучашись с чтением wav-файла, а затем с БПФ получил такую красоту


Этот график для сопоставления с Audacity


Но более наглядный с логарифмическим масштабом по X


Но самый наглядный с логарифмическим масштабом по X и Y


График хоть в учебнике публикуй!

Но есть одна загвоздка, до которой не могу допереть! Это у меня спектр мощности! Я его считаю тривиально, из массива действительных и мнимых величин вычисляю вектор (вспоминаем теорему пифагора): sqrt(re[i]*re[i]+im[i]*im[i+1]) и вывожу его.

А вот не могу понять, как здесь получить реальное значение амплитуды? Именно вот цифры 1600, 800, 16000?

P.S. Долбанный ЖЖ не даёт вписать дефайн BUF_SIZE

UPD. Забыл включить нормирование:

void fft_calc(
  int p,           // показатель двойки (например, для БПФ на 256 точек это 8)
  const float *c,  // массив поворотных множителей БПФ
  const float *in, // входной массив
  float *out,      // выходной массив
  int norm)        // признак нормировки


Последний параметр был равен нулю. Поставил единице, и всё стало на свои места:

Date: 2014-03-31 03:56 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Тебе что ли надо на заказ сделать готовую программулину? Или один раз проверить и забыть?
Если один раз, то есть же простой sox, которым что угодно можно нагенерировать. А обрабатывать можно было бы в октаве. Да и вообще, можно октавой звуки генерировать и писать...
// я себе так намедни подбирал наипростейшую аппроксимацию для эмуляции удара барабана на микроконтроллере. Оказалось, что достаточно линейно затухающей синусоиды.
Edited Date: 2014-03-31 03:56 pm (UTC)

Date: 2014-03-31 04:00 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Ну не на заказ - это моя основная работа :))))

Делаю проверочный комплекс железа, это одна из комплекса программ. Я знаю, что поиграться можно готовый софт использовать. Но в данном случае задача стояла сделать свой.

Date: 2014-03-31 04:03 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
А зачем БПФ свое городил? fftw3 ведь везде есть! На нее уйма софта завязана, так что, очень сложно встретить дистр без нее.
А вообще интересно это. Не то, что железяки напильником фигачить (мое основное занятие на всю эту неделю) ☹

Date: 2014-03-31 04:12 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Чтобы минимально зависеть от чужих либ. Да что там городил - два файлика: сишник и хедер на 150 строк.

Ну да, тестовое ПО пишу. Своеобразная работа, но интересно. Жаль что только х86

Date: 2014-03-31 04:33 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
> только х86
Это что за динозавр такой?

Date: 2014-04-01 07:31 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Чтобы минимально зависеть от чужих либ. Да что там городил - два файлика: сишник и хедер на 150 строк.

Ну да, тестовое ПО пишу. Своеобразная работа, но интересно. Жаль что только х86

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 01:11 pm
Powered by Dreamwidth Studios