Леонид, как привязываются коэффициенты и откуда их брать
Этот топик читают: Гость
Разработчик
Ответов: 26135
Рейтинг: 2126
|
|||
карма: 22 |
|
Ответов: 8923
Рейтинг: 823
|
|||
nesco, Фурье -- это преобразование данных на ВРЕМЕННОМ интервале в данные на сетке частот (и наоборот). Самая низкая частота соответствует одному периоду за весь временной интервал и имеет индекс 1 (индекс 0 имеет среднее значение всех данных), следующая частота с индексом 2 укладывается двумя периодами во всём интервале, т. е. она в два раза больше, частота с индексом 3 -- в три раза больше .... максимально возможная частота имеет всего два отсчёта за период и её значение в N/2 больше. Если при обратном преобразовании хочется отсеять высокие частоты выбираем 1--50 (условно, конечно), если надо удалить голос Шаляпина, выбираем 100-500, а если интересуют отдельные частоты, например 1500 МГц, её индекс выбираем и слушаем ионизированный водород
|
|||
карма: 19 |
|
Разработчик
Ответов: 26135
Рейтинг: 2126
|
|||
Ладно, тогда объясни из своего примера -- 2-5;7;12-23;32-128;200, что означают эти коэффициенты конкретно к твоей схеме
|
|||
карма: 22 |
|
Ответов: 8923
Рейтинг: 823
|
|||
nesco, предположим случай выдал массив из 1478 значений, первый компонент разложил его на 738 частотЫ (плюс постоянная составляющая), каждая характеризуется Амплитудой и начальной Фазой (углом), а их период (1/частота) характеризуется индексом (см. выше).
Если при обратном вычислении вторым компонентом использовать все частоты (все индексы), получим на выходе входной массив (с небольшой погрешностью, которую вносит дискретность и ограниченность частотного диапазона сверху -- в аналоговом преобразовании такого ограничения нет, ряд суммируемых частот бесконечен). Если по каким-либо причинам не нужны те или иные частоты, они и не должны участвовать в обратном преобразовании, а индексы нужных частот обозначены как раз в примере. |
|||
карма: 19 |
|
Разработчик
Ответов: 26135
Рейтинг: 2126
|
|||
Леонид писал(а): предположим случай выдал массив из 1478 значений, первый компонент разложил его на 738 частотЫА стартовая и конечная частота откуда берутся Чтобы знать, что отфильтровать, надо знать какому индексу, какая частота соответствует. Из того, что ты написал, я нифига не понял, откуда берутся граничные частоты Я просто этим раньше не занимался вплотную, но интересно знать |
|||
карма: 22 |
|
Ответов: 8923
Рейтинг: 823
|
|||
Наконец-то настроил Интернет на своём компьютере! Всё вижу!
nesco, тогда так: имеем звук с дискретизацией 44100 Гц. Из него берём интервал в 2048 данных или Т=2048/44100~=0,0464 секунды. Тогда самая низкая частота с периодом на весь интервал F1=1/Т=1/0,0464~=21.5 Гц и имеет индекс в разложении "1", следующая частота с индексом "2" (два периода на весь интервал) F2=1/(T*2)=F1*2=43.1 Гц, F3=F1*3~=64.6 Гц.... Самая высокая частота с индексом "1023" равна F1023=F1*1023~=22028 Гц. Более высокие частоты, имеющие только два и менее отсчётов за период, не могут быть правильно определены в дискретном преобразовании Фурье. Уф... (Всё таки надо иметь ТАЛАНТ популяризатора, чтобы доходчиво объяснять вещи, кстати у nesco тоже его нет ) Быстрое преобразование Фурье на выходе, к завтрешнему утру отшлифую |
|||
карма: 19 |
|
Разработчик
Ответов: 26135
Рейтинг: 2126
|
|||
Леонид писал(а): берём интервал в 2048Ну, с этим понятно. А с этим тогда как Леонид писал(а): выдал массив из 1478 значений, первый компонент разложил его на 738 частотЫГде тут 2048, мыши погрызли |
|||
карма: 22 |
|
Ответов: 8923
Рейтинг: 823
|
|||
nesco, если 44100 дискретный звук берём интервалами 1478 слов, то низшая частота разложения станет F1=1/(1478/44100)~=29.8 Гц, высшая F738=F1*738~=22020 Гц, в общем случае при интервале в N значений: F1=44100/N, F(N/2-1)=(N/2-1)*44100/N
|
|||
карма: 19 |
|
Разработчик
Ответов: 26135
Рейтинг: 2126
|
|||
Ага, более-менее понятно.
Леонид писал(а): берём интервалами 1478 словДа, а почему не 2048, чем это объясняется |
|||
карма: 22 |
|
Ответов: 8923
Рейтинг: 823
|
|||
nesco, Обычное преобразование Фурье по данным любой длины N содержит N^2 умножений и столько же вычислений синусов-косинусов не считая операций сложения, но если длина N кратна равна одной из степеней двойки (4-8-16...256...2048...65536...), то значения этих синусов-косинусов совпадают, всего их остаётся N значений (при фиксированной длине их можно вычислить один раз заранее), появляется возможность (учат в 6-м классе) вынесения за скобки этих синусов, что значительно сокращает количество умножений, соответственно и времени в КОРЕНЬ(N) раз, поэтому и применяют обычно такие длины выборок.
------------ Дoбавленo в 18.53: Добил, наконец, быстрое преобразование Фурье, компонент приложен с тестовой схемой, прошу испытывать fft_for_hiasm.rar |
|||
карма: 19 |
| ||
файлы: 1 | fft_for_hiasm.rar [6.3KB] [345] | ||
Голосовали: | ser_davkin |
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 7 раз(а), последний 2021-06-24 07:04:03 |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
86.110.166.254 писал(а): Ой, тестеров нету |
|||
карма: 25 |
|
Разработчик
Ответов: 26135
Рейтинг: 2126
|
|||
Tad писал(а): видно никому не надоЯ еще только увидел |
|||
карма: 22 |
|
Ответов: 8923
Рейтинг: 823
|
|||
nesco, посмотрите, пожалуйста, почему в компоненте функция THIArrayFFT._CountA; выдаёт правильную длину массива амплитуд, равную половине длины входного массива, а при переборе его с нижней точки компонентом ArrayEnum выдаётся более чем в два раза больше значений, причём первые соответствуют амплитудам, а остальные чёрти что
------------ Дoбавленo в 01.28: Блин, код схемки ждал отправления полчаса, да так и не дождался (Выход с ArrayEnum на Список строк) |
|||
карма: 19 |
|
Разработчик
Ответов: 26135
Рейтинг: 2126
|
|||
Леонид писал(а): Выход с ArrayEnum на Список строкНа всякий случай выложи проблемную схемку. Днем посмотрю, не возражаешь, я вообще хочу все компоненты пересмотреть, правда че-то руки пока не дошли, но надо. |
|||
карма: 22 |
|