В процессе деланья ФФТ-аналайзера возникают вопросы)
На данный момент:
Захватываю окно N из звуковушки, из него делаю ффт:
- на входе ряд N комплексных чисел с real=n, imag=0;
- на выходе ряд N, состоящий из n[0] = DC, n[N/2] = Fs; n[N]=0Hz, т.е. зеркальный спектрум с центром N/2, положительные частоты в начале, отрицательные в конце. Беру только положительные, т.к. imag=0 на входных данных = данные одинаковы с обоих сторон.
Ура, работает.
Теперь рисовать.
На экране 1000 точек и он логарифмичен, в ффт - N/2., и линейный. В случае, когда на точку экрана приходится несколько бинов, с этим нужно что-то делать :)
Обычно(?) рисуют либо все бины на пиксель, получается вертикальная линия от bin_min до bin_max; Получается толстый шершавый график.
Либо рисуют только максимальный бин на пиксель. График = линия толщиной в пиксель.
Но это все как-бы не правильно))) Правильно - как-то их аггрегировать.
Например суммировать их квадраты, pixel = sqrt(n1^2+n2^2+n3^2). что правильно с т.з. отображаемой мощности.
или RMS, pixel = sqrt((n1^2+n2^2+n3^2) / 3)
можно ваще pow(n1*n2*n3,-3) геометрического среднего))
аналогичная ситуация и с просчетом искажений. например имеем несущую на частоте 1к с максимумом -60дБ.
но она не совсем стабильна по частоте, поэтому имеет размазанный вид (попадает сразу на несколько бинов, горбиком) = ее пик -60дБ не настоящий, и нужно аггрегировать соседние бины для того, чтобы получить настоящий уровень пика.
----------
Коммерческая страничка проги - https://xdxd.io/spectrum-analyzer/
На данный момент:
Захватываю окно N из звуковушки, из него делаю ффт:
- на входе ряд N комплексных чисел с real=n, imag=0;
- на выходе ряд N, состоящий из n[0] = DC, n[N/2] = Fs; n[N]=0Hz, т.е. зеркальный спектрум с центром N/2, положительные частоты в начале, отрицательные в конце. Беру только положительные, т.к. imag=0 на входных данных = данные одинаковы с обоих сторон.
Ура, работает.
Теперь рисовать.
На экране 1000 точек и он логарифмичен, в ффт - N/2., и линейный. В случае, когда на точку экрана приходится несколько бинов, с этим нужно что-то делать :)
Обычно(?) рисуют либо все бины на пиксель, получается вертикальная линия от bin_min до bin_max; Получается толстый шершавый график.
Либо рисуют только максимальный бин на пиксель. График = линия толщиной в пиксель.
Но это все как-бы не правильно))) Правильно - как-то их аггрегировать.
Например суммировать их квадраты, pixel = sqrt(n1^2+n2^2+n3^2). что правильно с т.з. отображаемой мощности.
или RMS, pixel = sqrt((n1^2+n2^2+n3^2) / 3)
можно ваще pow(n1*n2*n3,-3) геометрического среднего))
аналогичная ситуация и с просчетом искажений. например имеем несущую на частоте 1к с максимумом -60дБ.
но она не совсем стабильна по частоте, поэтому имеет размазанный вид (попадает сразу на несколько бинов, горбиком) = ее пик -60дБ не настоящий, и нужно аггрегировать соседние бины для того, чтобы получить настоящий уровень пика.
----------
Коммерческая страничка проги - https://xdxd.io/spectrum-analyzer/
Аминь.