?

Log in

No account? Create an account
  Journal   Friends   Calendar   User Info   Memories
 

Электронный миссионер

31st March, 2014. 5:50 pm. Капелька ЦОСа. Обожаю его.

Вообще, если бы была возможность работать с железом и ЦОСом (цифровой обработкой сигналов), то я был бы самым счастливые человеком на земле. Разумеется чтобы и не обижали рублём. Вот сейчас выпала такая возможность, пишу софт для тестирования звуковой карты под 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 Проверка спектраCollapse )

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

Но самый наглядный с логарифмическим масштабом по 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)        // признак нормировки


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

Read 6 Notes -Make Notes

Back A Day - Forward A Day