Re[7]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 01:09
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Шахтер, Вы писали:


Ш>>Это не делают БПФ ом. Пороюсь в своих архивах, напишу позже.


A>Да? А у меня почти вышло


Это из пушки по воробъям
Re[12]: Частотная характеристика звука.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.12.05 01:14
Оценка:
Здравствуйте, jhng, Вы писали:

Большое спасибо за подробный ответ. А то я по АКФ только Аэрокосмический факультет нашёл

Что касается того что есть. Шумов практически нету. Точность нужна в 20Гц-50Гц (3% от частоты). Требований к вычислитеной сложности особых нет, но делаться всё должно в real-time.

Сейчас делаю так. Беру достаточно большой (около трети секунды) массив семплов. Конкретно 8192. Натравляю БПФ, ищу самые интенсивные гармоники. Сдвигаю всё на 2048 семплов. Работае в принципе неплохо, но есть минусы.
Формально надо распознавать сигналы длительностью от 30мс, а это 675 семплов или 15-30 полных колебаний. На таком объёме данных почему-то БПФ по чёрному обламывается. От оконных функций, если честно, особого эффекта так и не наблюдал, может как-то не не так пользуюсь.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Частотная характеристика звука.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.12.05 01:17
Оценка:
Здравствуйте, vdimas, Вы писали:

АКФ судя по всему важная вешь

А доки нету, а то что такое "2 фильтра НЧ первого порядка" я тоже не знаю. Я только с БПФ работал, да и то немного.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[12]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 01:19
Оценка: 36 (1)
Здравствуйте, jhng, Вы писали:

J>P.S. Поковырял в matlab методы спектрального оценивания. Без шума частоты оценивает просто супер.

J>А вот если шум добавить, тогда... Короче если даже небольшой шум в канале связи (-20 dB) — не прокатит, слишком близко частоты.

Потому что АКФ тут не к месту. Нужна обычная банальная корреляция с требуемыми частотами, она отлично работает даже при уровне шума превышающем уровень сигнала. Корреляция с некоей частотой считается как произведение отсчетов сигнала на сдвинутые на 90 градусов отсчеты синусоид исследуемой частоты.

Т.е. у нас есть отсчеты f и f' — это сдвинутые на 90 градусов отсчеты исследуемой частотной составляющей.
p — отсчеты входного сигнала.

на каждом шаге:
s += p * f;
s' += p * f';

s и s' небходимо фильтровать НЧ c нужным срезом (смотря какая нужна скорость реакции).

Текущая мощность — sqrt(s*s + s'*s'); ВСЕ!!!
Re[13]: Частотная характеристика звука.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.12.05 01:22
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Потому что АКФ тут не к месту.


Вы меня совсем запутали

V>Нужна обычная банальная корреляция с требуемыми частотами, она отлично работает даже при уровне шума превышающем уровень сигнала.


А сколько колебаний её нужно для устойчивого распознавания частоты? 10-20 хватит?

V>Корреляция с некоей частотой считается как произведение отсчетов сигнала на сдвинутые на 90 градусов отсчеты синусоид исследуемой частоты.

V>Т.е. у нас есть отсчеты f и f' — это сдвинутые на 90 градусов отсчеты исследуемой частотной составляющей.
V>p — отсчеты входного сигнала.

V>на каждом шаге:

V>s += p * f;
V>s' += p * f';

V>s и s' небходимо фильтровать НЧ c нужным срезом (смотря какая нужна скорость реакции).


V>Текущая мощность — sqrt(s*s + s'*s'); ВСЕ!!!


Я так понимаю сигнал распознан, если эта самая текущая мошьность неменее какого-то порога на протящее какого-то промежука времени?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[13]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 01:27
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, jhng, Вы писали:


A>Большое спасибо за подробный ответ. А то я по АКФ только Аэрокосмический факультет нашёл


A>Что касается того что есть. Шумов практически нету. Точность нужна в 20Гц-50Гц (3% от частоты). Требований к вычислитеной сложности особых нет, но делаться всё должно в real-time.


A>Сейчас делаю так. Беру достаточно большой (около трети секунды) массив семплов. Конкретно 8192. Натравляю БПФ, ищу самые интенсивные гармоники. Сдвигаю всё на 2048 семплов. Работае в принципе неплохо, но есть минусы.

A>Формально надо распознавать сигналы длительностью от 30мс, а это 675 семплов или 15-30 полных колебаний. На таком объёме данных почему-то БПФ по чёрному обламывается. От оконных функций, если честно, особого эффекта так и не наблюдал, может как-то не не так пользуюсь.

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

Если суть непонятна — пиши в приват, накатаю грубую реализацию.
Re[7]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 01:38
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, vdimas, Вы писали:


A>АКФ судя по всему важная вешь


Нет, это не АКФ, это просто КФ, она лучше подходит сюда.

A>А доки нету, а то что такое "2 фильтра НЧ первого порядка" я тоже не знаю. Я только с БПФ работал, да и то немного.


фильтр нижних частот первого порядка программируется крайне легко. Пусть p — отчеты сигнала, k — некий коеф, определяющий частоту среза относительно частоты дискретизации, s — выход фильтра.

На каждом шаге:
s = s * (1 — k) + p * k;

оно же:
s = s — (s-p) * k;

Если к==0.25, то это примерно так (привычка обходиться без умножения при обработке сигналов):
s = s — ( (s — p) >> 2)
Re[14]: Частотная характеристика звука.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.12.05 01:45
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Нет, формально надо распознавать за 20мс, иначе не поймаешь от некоторых старых телефонов, т.е. у тебя в распоряжении еще меньше полных колебаний. Никакая окна тебе не нужны, тебе нужен непрерывный процесс.


Я этим пользовался http://www.ece.utexas.edu/~mason/codesign/dtmf.html. Вроде как минимум 40мс, а от 23мс до 40мс как получится.

V>Если суть непонятна — пиши в приват, накатаю грубую реализацию.


Да нет, мне сами алгоритмы тоже интересны. Может потом опять пригодиться, хочу понять суть. Понятая мною суть пока такая (я сразу о реализации).

Есть бесконечный массив семплов (ну грубо говоря, сильно старые меня конечно не волнуют).
Есть частота дискретизацц D, частота которую надо распознать F, минимальная распознаваемая длительность сигнала T.
Для каждого sample[i], частоты D я вычисляю

sum1[F, i] += sample[i] * sin(2*pi*i/D);
sum2[F, i] += sample[i] * sin(2*pi*i/D + pi/2);
energy[F, i] = sqrt(sum1[F, i]*sum1[F, i]) + sqrt(sum2[F, i]*sum2[F, i])

Если есть такой промежуток [k — D*T, k], что на нём energy[F, i] всегда больше некоторого порогового значения, то считать, что сигнал распознан.
Насколько я понимаю, мне понадобиться считать и общую энергию сигнала.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[14]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 01:46
Оценка:
Здравствуйте, adontz, Вы писали:

V>>Потому что АКФ тут не к месту.


A>Вы меня совсем запутали


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

V>>Нужна обычная банальная корреляция с требуемыми частотами, она отлично работает даже при уровне шума превышающем уровень сигнала.


A>А сколько колебаний её нужно для устойчивого распознавания частоты? 10-20 хватит?


вполне

V>>Корреляция с некоей частотой считается как произведение отсчетов сигнала на сдвинутые на 90 градусов отсчеты синусоид исследуемой частоты.

V>>Т.е. у нас есть отсчеты f и f' — это сдвинутые на 90 градусов отсчеты исследуемой частотной составляющей.
V>>p — отсчеты входного сигнала.

V>>на каждом шаге:

V>>s += p * f;
V>>s' += p * f';

V>>s и s' небходимо фильтровать НЧ c нужным срезом (смотря какая нужна скорость реакции).


V>>Текущая мощность — sqrt(s*s + s'*s'); ВСЕ!!!


A>Я так понимаю сигнал распознан, если эта самая текущая мошьность неменее какого-то порога на протящее какого-то промежука времени?


Прикол в том, что "протяжение какого-то промежутка времени" задается частотой среза ФНЧ. Поэтому достаточно просто факта достижения порога.

Опять обращаю внимание, что порог — величина относительная общей мощности сигнала.

Общую мощность сигнала считаем так:
sqrt(ФНЧ(p * p))
Re[15]: Частотная характеристика звука.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.12.05 02:15
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Общую мощность сигнала считаем так:

V>sqrt(ФНЧ(p * p))

А зачем нам ФНЧ (фильтр низкой частоты?) для подсчёта общей мощности?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[15]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 02:55
Оценка: 33 (1)
Здравствуйте, adontz, Вы писали:

A>Есть бесконечный массив семплов (ну грубо говоря, сильно старые меня конечно не волнуют).

A>Есть частота дискретизацц D, частота которую надо распознать F, минимальная распознаваемая длительность сигнала T.
A>Для каждого sample[i], частоты D я вычисляю

A>sum1[F, i] += sample[i] * sin(2*pi*i/D);

A>sum2[F, i] += sample[i] * sin(2*pi*i/D + pi/2);
A>energy[F, i] = sqrt(sum1[F, i]*sum1[F, i]) + sqrt(sum2[F, i]*sum2[F, i])

Мне больше импонирует потоковый вариант, т.е. алгоритм надо писать просто в расчете подачи на вход очередного sample, без ориентации на массивы.

A>Если есть такой промежуток [k — D*T, k], что на нём energy[F, i] всегда больше некоторого порогового значения, то считать, что сигнал распознан.


Нет, из-за шума и из-за второй частоты не все твои отсчеты будут больше некоторого порогового значения. Это все надо сглаживать. Если подобрать частоту среза ФНЧ 1/20мс, то достаточно обнаружить сам факт достижения порогового значения.

Затем надо не забыть обнаружить паузу

Сигнал распознан, если две и только две частоты из сетки обнаружены.


A>Насколько я понимаю, мне понадобиться считать и общую энергию сигнала.


Обязательно, порог — величина относительная. Громкость в канале не постоянная. Я тут давал уже как считать общую енергию. Ее тоже надо сглаживать точно таким же фильтром.

Короче, навскидку так:
    // фильтр НЧ
    public struct FNC {
        public double k;        // коэф
        public double outp;     // выход фильтра

        public void Step(double inp) {
            outp -= (outp - inp) * k;
        }

        public FNC(double k) {
            this.k = k;
            this.outp = 0;
        }
    }

    // подсчитываем квадрат текущей мощности сигнала
    public struct EnergySum {
        FNC fnc;

        public void Step(double inp) {
            fnc.Step(inp * inp);
        }

        public EnergySum(double k) {
            fnc = new FNC(k);
        }
    }

    // генерируем отсчеты
    public struct Generator {
        public double outp, outp90;
        double df, q;

        /// <param name="f_discr">частота дискретизации</param>
        /// <param name="f_generate">частота генератора</param>
        public Generator(double f_discr, double f_generate) {
            df = 2 * Math.PI * f_generate / f_discr;

            q = 0;
            outp = outp90 = 0;
        }

        public void Step() {
            q += df;
            if (q > 2 * Math.PI)
                q -= 2 * Math.PI;

            outp = Math.Sin(q);
            outp90 = Math.Cos(q);
        }
    }

    // целевой детектор частоты
    public class Detector {
        FNC fnc, fnc90;
        Generator generator;
        public double outp;            // выход детектора
        public bool signal;            // обнаружен сигнал выше порога

        const double reaction = 0.025; // 25 mc
        const double threshold = 0.2;

        public Detector(double f_discr, double f_detect) {
            double k = 1 - Math.Pow(Math.Sqrt(2) / 2, 1 / (2 * f_discr * reaction));
            fnc = new FNC(k);
            fnc90 = new FNC(k);
            generator = new Generator(f_discr, f_detect);
            outp = 0;
            signal = false;
        }

        public void Step(double inp, double energy) {
            generator.Step();
            fnc.Step(inp * generator.outp);
            fnc90.Step(inp * generator.outp90);
            outp = fnc.outp * fnc.outp + fnc90.outp * fnc90.outp;
            signal = energy * threshold < outp;
        }
    }

    // пересечение 2-х частот на клавиатуре
    public class Analizer {
        Detector horizontal;
        Detector vertical;
        public char symbol;
        public bool signal = false;

        public Analizer(Detector h, Detector v, char symb) {
            horizontal = h;
            vertical = v;
            symbol = symb;
        }

        public void Step() {
            signal = horizontal.signal && vertical.signal;
        }
    }


Могут быть всякие мелкие неточности.
С инкапсуляцией тоже не заморачивался.

Замечание.
Генератор вполне может генерить {0, 1}, а не просчитывать синусы/косинусы каждый раз. Если точности будет не хватать, то буквально в 3-х битах закодированая таблица синусоиды дает уже весьма точные результаты. Т.е. почти все здесь можно переводить на int.
Re[16]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 03:02
Оценка:
Здравствуйте, adontz, Вы писали:

V>>Общую мощность сигнала считаем так:

V>>sqrt(ФНЧ(p * p))

A>А зачем нам ФНЧ (фильтр низкой частоты?) для подсчёта общей мощности?


Хмм... проблема серьезного взаимонепонимания

Текущие отсчеты бывают разные, и мнговенные значения квадрата мощности тоже разные, иногда пиковые, иногда нулевые. Интересует некий интеграл за определенное время.

Однако суть самой задачи такова, что делить входную последовательность на окна — это все испортить. Например, если у нас реакция должна быть 20 мс, то какое нам брать окно, чтобы не прозевать эту рекию? 10мс? 5мс?

Поэтому мы делаем непрерывное интегрирование. Подобрав правильную частоту среза в фильтрах мы обнаружим сигнал как раз если он будет длительностью не менее 20 мс.
Re[17]: Частотная характеристика звука.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.12.05 03:15
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Поэтому мы делаем непрерывное интегрирование. Подобрав правильную частоту среза в фильтрах мы обнаружим сигнал как раз если он будет длительностью не менее 20 мс.


Так, а что такое частота среза? Я думал что это имеет смысл вроде 1/(длина окна), но только окно плавающее, а сейчас уже сомневаюсь.

Вообще чем мучаться со мной, может кинуть в сеня ссылкой на документацию?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[18]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 03:48
Оценка: 24 (1)
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, vdimas, Вы писали:


V>>Поэтому мы делаем непрерывное интегрирование. Подобрав правильную частоту среза в фильтрах мы обнаружим сигнал как раз если он будет длительностью не менее 20 мс.


A>Так, а что такое частота среза?


Частота среза — это такая частота фильтра, мощность которой падает вдвое при прохождении через фильтр. т.е. остается примерно 70% от амплитуды.

A>Я думал что это имеет смысл вроде 1/(длина окна), но только окно плавающее, а сейчас уже сомневаюсь.


Нет, нерекурсивные фильтры тоже бывают оконными. Так вот, частота среза не зависит от длины окна, она зависит от коэф. От длины окна зависит точность. В идеале окно должно быть бесконечным, а плавать — ровно на 1 отсчет. Поэтому мне более по душе рекурсивные фильтры (с бесконечной историей) и потоковые алгоритмы на их основе.


A>Вообще чем мучаться со мной, может кинуть в сеня ссылкой на документацию?


Хм... когда я всем этим занимался вплотную русскоязычного интернета еще не существовало. Я думаю, что "z-преобразование цифровые фильтры" — неплохое сочетания для гугла

--------
Вот нарыл сжатое нечто: http://www.npi.msu.su/structinc/lib/books/nuc_el/p1.pdf

Там и теория и практика. Возможно, что я неправильно расчитал k в своем ФНЧ в том исходнике. Как раз сможешь проверить или пересчитать.
Re[19]: Частотная характеристика звука.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.12.05 04:13
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Частота среза — это такая частота фильтра, мощность которой падает вдвое при прохождении через фильтр. т.е. остается примерно 70% от амплитуды.


По идее их две должно быть. Нет?

V>Вот нарыл сжатое нечто: http://www.npi.msu.su/structinc/lib/books/nuc_el/p1.pdf


Спасибо!
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[20]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 07:35
Оценка:
Здравствуйте, adontz, Вы писали:

V>>Частота среза — это такая частота фильтра, мощность которой падает вдвое при прохождении через фильтр. т.е. остается примерно 70% от амплитуды.


A>По идее их две должно быть. Нет?


Для полосового? Да, их две для полосового фильтра. А у фильтра низких частот есть только одна частота среза. На самом деле ФНЧ первого порядка имеет очень пологую характеристику среза, т.е. нет такого, что вот до какой-то частоты мы пропускаем, а потом — хлоп и нету. Речь лишь может идти о коэф. подавления сигнала.
За частоту среза выбрана такая частота, мощность сигнала на которой падает вдвое при прохождении через фильтр.

На ФНЧ удобно делать всякие сглаживатели, т..е например вот грубо сигнал после умножения на самого себя (синий) и после фильтрации неким фильтром низких частот (красный):

http://www.rsdn.org/File/21096/FNC.GIF

Примерно так у нас будет работать детектор мощности сигнала. Кстати, на рисунке частота среза ФНЧ — это примерно 4 периода основного синего сигнала. На практике, у тебя реакия = 25 мс, т.е. 40 Гц, а наименьшая входная частота 600 с копейками, т.е. на самом деле картинка будет еще более гладкой. Да, кстати, забыл сказать, чтобы перед подачей сигнала в систему предварительно отфильтровали его фильтром ВЧ, для убирания постоянной составляющей, и для отсекания лишней полосы шума. Кстати, неплохо это сделать и "сверху". Итого мы получим полосовой фильтр на входе, который выделяет интересующую нас полосу. Добавлю, что если полосовой фильтр будет 2-го порядка, то ты получишь очень покатые спады АЧХ, поэтому частоты среза фильтров надо выбирать с запасом примерно вдвое. Т.е. если крайняя нижняя полоса DTMF = 650, то бери на ФВЧ примерно 325.
Re[9]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 08:36
Оценка: +1
Здравствуйте, LelicDsp, Вы писали:

J>>Если все возможные частоты сигналов в канале зараннее известны, то можно использовать набор оптимальных фильтров (фильтров Винера) и анализировать уровень сигнала на выходе каждого из них.

LD>оптимальный фильтр для синусоиды как выглядит?

Ребята, ну хватит уводить человека в сторону. Задача не стоит — отфильтровать сигнал. Задача стоит — обнаружить факт наличия. Корреляция с эталоном — это самый простой и самый надежный способ. Прекрасно работает даже в условиях, когда шум сильно перекрывает основной сигнал.
Re[9]: Частотная характеристика звука.
От: Шахтер Интернет  
Дата: 27.12.05 18:03
Оценка: 36 (1) +1
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Шахтер, Вы писали:


Ш>>Держи код


A>Ни хрена не понял, но спасибо


Давай поясню математику.

Что делает генератор DTMF сигнала. Он выдаёт сумму двух синусоид одинаковой мощности.
После прохождения тракта ты получишь снова сумму двух синусоид.
Но вообще говоря, их частоты будут чуть-чуть сдвинуты, мощности не будут строго одинаковы и добавится шумок.

Пусть у нас частота синусоид F1 и F2, амплитуды A1 A2, частота дискретизации Fd.

Тогда сигнал на входе A1*sin(2*Pi*(F1/Fd)*k+phi1) + A2*sin(2*Pi*(F2/Fd)*k+phi2) + шум , где phi1 и phi2 неизвестные фазы сигналов.

Заметим что, A1*sin(2*Pi*(F1/Fd)*k+phi1) = A1*cos(phi1)*sin(2*Pi*(F1/Fd)*k) + A1*sin(phi1)*cos(2*Pi*(F1/Fd)*k).

Иными словами, данная составляющая сигнала есть линейнаю комбинация двух сигналов sin(2*Pi*(F1/Fd)*k) и cos(2*Pi*(F1/Fd)*k).

Эти два сигнала почти ортогональны (в общем случае, если число отсчетов достаточно велико, грубо говоря, содержит сотню периодов данной частоты, то неортогональностью можно пренебречь, что мы и будем делать).

Аналогично, у нас еcть вторая пара sin(2*Pi*(F2/Fd)*k) и cos(2*Pi*(F2/Fd)*k), которая к тому же почти ортогональна первой.

Т.е. фактически, нам нужно просто спроектировать полученный сигнал на две ортогональные плоскости плоскости и вычислить энергию проекций.
Что собственно мы и делаем. Дальше проверяем, что мощность на одной из пар стандартных частот превосходит порог.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Частотная характеристика звука.
От: vdimas Россия  
Дата: 27.12.05 19:33
Оценка: 9 (1)
Здравствуйте, adontz, Вы писали:

Кстати!!! Как я забыл об одной офигительной вещи — EWB www.electronicsworkbench.com

В общем, что это за приблуда — это такой симулятор электрических и цифровых схем. Идеальный инструмент для твоего случая.

Как им пользоваться. У него есть большая бибилотека элементов, и если не ошибаюсь, DTMF генератор тоже есть. Если нет — не страшно, можно просто проссумировать выход 2-х синусоидальных генераторов.


Итак. Как я предлагаю использовать EWB для твоих экспериментов/расчетов?

Надо составить электрическую схему описанного мною алгоритма. Т.е. ставишь DTMF генератор, затем накидываешь на схему умножитель (для анализа мощности), выход пропускаешь через ФНЧ — получил оценивание квадрата мощности входного сигнала.

Затем накидываешь анализатор. Он состоит из генератора синусоиды с 2-мя выходами в 90 градусов, двух умножителей, двух фильтров НЧ. Выходы этих фильтров опять умножаем на себя и складываем (f1*f1+f2*f2) — получили квадрат мощности искомого сигнала.

Выход анализатора мощности сравниваем с выходом анализатора сигнала с помощью компаратора — порогового устройства.

К любой точке схемы можно подключать осциллограф и смотреть или записывать а потом внимательно смотреть на происходящее. Очень удобно будет отладить все параметры схемы, погонять его в разных условиях, подмешивая шум и т.д.

В общем, весьма и весьма рекомендую. Крайне полезный тул для подобных задач.

----------
Если не ошибаюсь, в последних версиях все ok с модульностью (последний раз серьезно работал с ним в 97-м), т.е. каждый элемент можно описать как модуль и затем использовать повторно. Короче, собрать ПОЛНУЮ схему анализатора DTMF, состоящего из отдельных анализаторов частот будет более чем просто.
Re[10]: Частотная характеристика звука.
От: vdimas Россия  
Дата: 02.01.06 21:15
Оценка:
Здравствуйте, Шахтер, Вы писали:


Пара комментариев:

Ш>Иными словами, данная составляющая сигнала есть линейнаю комбинация двух сигналов sin(2*Pi*(F1/Fd)*k) и cos(2*Pi*(F1/Fd)*k).


Линейная комбинация — это суть векторная сумма. Зря ты убрал из формул sin(phy1) и cos(phy1) — стало непонятно слушателям.

Эти sin(phy1) и cos(phy1) и есть искомые проекции, модуль мощности мы потом считаем по теореме Пифагора, т.е. по правилу вычисления модуля векторов.

Ш>Т.е. фактически, нам нужно просто спроектировать полученный сигнал на две ортогональные плоскости плоскости и вычислить энергию проекций.


Роме: проекция вычисляется путем свертки с единичным сигналом.

Ш>Что собственно мы и делаем. Дальше проверяем, что мощность на одной из пар стандартных частот превосходит порог.


Угу, у меня примерно тоже самое http://www.rsdn.ru/Forum/Message.aspx?mid=1563751&amp;only=1
Автор: vdimas
Дата: 27.12.05


(правда, я вычисления синусов/косинусов не буферировал, т.к. в оригинальном варианте у меня вообще умножение на прямоугольные сигналы сдвинутые на 90 градусов).

Отличие от твоего варианта в том, что твой вариант реально требует довольно-таки длинной последовательности, иначе подобный детектор будет реагировать на входные частоты с большим отклонением, чем 3% в стандарте. К тому же, буфер каждый раз пересчитывается по кругу.

В общем, предлагаю вместо этого использовать "бесконечный" сумматор, выполненный в виде фильтра НЧ с частотой среза, обратной скорости реакции. Сама характеристика фильтра НЧ уже является некоей оконной ф-ией, где последние отсчеты будут больше влиять на результат, чем дальние. А в твоем варианте с кольцевым буфером "давние" отсчеты так же влияют на результат, как и самые последние. (Хотя, надо погонять оба варианта... Подход у них абсолютно одинаковый...)

Повторюсь, что мой вариант прекрасно работал с прямоугольными образцовыми сигналами, т.е. вместо умножения, делаем так: 1 — прибавляем, 0 — отнимаем. Точность по частоте в случае со сверткой с прямоугольными импульсами примерно обратна количеству полупериодов, т.е. получалась около 5%, что вполне хватает. Паразитные гармоники прямоугольного сигнала влияли не сильно, т.к. входной сигнал сначала отфильтровывался, т.е. подавался лишь сигнал из искомого диапазона. И к счастью, ближайшая значимая гармоника прямоугольного сигнала — третья (остальные — менее значимые), т.е. в случае с DTMF паразитные гармоники оказываются за пределами допустимых стандартом погрешностей. Когда я этим всем занимался, мне показалось, что частоты DTMF неспроста были выбраны именно так, старые аппаратные умножители для DTMF-детекторов делались на диодах, там как раз умножение с прямоугольным импульсом получалось.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.