общие вопросы по ЦФ

Все что касается фильтрации
Pavia
Сообщения: 38
Зарегистрирован: 25 апр 2011, 18:45

Re: общие вопросы по ЦФ

Сообщение Pavia »

MinSingle = 1.5e-45;
MaxSingle = 3.4e+38;
MinDouble = 5.0e-324;
MaxDouble = 1.7e+308;
MinExtended = 3.4e-4932;
MaxExtended = 1.1e+4932;

Чтобы получить 600db=2*10*Log(x) => x=10^30

Single имеет 23 значащих бита около 6.9 значащих десятичных цифр
Double имеет 52 значащих бита около 15.6 значащих десятичных цифр
Extended имеет 64 значащих бита около 19.26 значащих десятичных цифр
На CPU-FPU ; +-*/ обычно выполняется в Extended, а вот cos, tan и тд в формате Double.

Скорее всего сыпется не при расчёте, а при построении графика. Хотя при расчёте и при фильтрации при ваших порядках тоже может начать сыпаться.

Порядки чисел на входе и на выходе и их число надо всегда оценивать чтобы не попасть на переполнение.

Выхода тут только один это уйти в длинную арифметику. Малой кровью думаю не отделаетесь. Хотя конечно можно Quadruple использовать. Кнут описывал как делать операции double при помощи single.

ivanenkomaxim
Сообщения: 5
Зарегистрирован: 19 фев 2012, 15:58

Преобразование ФНЧ-ФВЧ

Сообщение ivanenkomaxim »

Здравствуйте! Столкнулся с проблемой при преобразовании ФНЧ-ФВЧ. Вот код на языке C# для вычисления коэффициентов фильтра Баттерворта из примера для ФНЧ:

Код: Выделить всё

//Коридор АЧХ
Rp = 1;
Rs = 30;
wp = 0.2 * Math.PI;
ws = 0.6 * Math.PI;
...
//Вызов метода
static void Butterworth(double Rp, double Rs, double wp, double ws, out double[] a, out double[] b)
{
    //Задания коридора АЧХ для аналогового фильтра
    wp = Math.Tan(wp / 2.0);
    ws = Math.Tan(ws / 2.0);
    ...
    //Вычисление передаточной х-ки, как массива коэффициентов знаменателя
    ...
    //Подстановка s->s/wp в передаточную х-ку, что эквивалентно делению коэффициентов на частоту среза в соответствующей степени, где C - коэффициенты знаменателя
    for (n = 0; n <= N; n++)
         C[n] /= Math.Pow(wp, n) / Ep;
    //Билинейное преобразование
    DigitalTransferFunction(null, C, out a, out b);
}
В этом случае вычисления проходят успешно, АЧХ выглядит так.
Тем не менее, в статье по формуле (10) и (11) успешно вычислить у меня не удается:

Код: Выделить всё

    //Реверсия коэффициентов знаменателя передаточной х-ки
    C = C.Reverse().ToArray();
    //Подстановка s->wp/s в передаточную х-ку
    for (n = 0; n <= N; n++)
        C[n] *= Math.Pow(wp, n) * Ep;
В результате у меня получается совсем не фильтр верхних частот, а какой-то некорректный ФНЧ.
Подскажите, пожалуйста, что я упустил, может быть есть еще дополнительные преобразования частот? Есть ли у Вас возможность предоставить часть кода, в которой происходит преобразование ФНЧ-ФВЧ?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: общие вопросы по ЦФ

Сообщение Бахурин Сергей »

думаю вы неправильно делаете подстановку. Вот например


подставляю s = 0.5/s получаем:


Это совсем не то что просто все коэффициенты пересчитать по формуле 0.5/коэфф. Почитайте про дробнорациональную подстановку.

ivanenkomaxim
Сообщения: 5
Зарегистрирован: 19 фев 2012, 15:58

Re: общие вопросы по ЦФ

Сообщение ivanenkomaxim »

Бахурин Сергей писал(а):думаю вы неправильно делаете подстановку. Вот например


подставляю s = 0.5/s получаем:


Это совсем не то что просто все коэффициенты пересчитать по формуле 0.5/коэфф. Почитайте про дробнорациональную подстановку.
Спасибо большое! Я действительно не учел этого, и теперь все исправил - преобразование ФНЧ-ФВЧ работает!

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

Что в этой формуле значит ? Я сделал так:

Логарифм от комплексного числа реализовал так:

Из-за этого арксинуса не могу закончить эллиптический фильтр. Могли бы Вы помочь мне и сказать где я ошибаюсь? Заранее благодарен.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: общие вопросы по ЦФ

Сообщение Бахурин Сергей »

вроде как правильно все сделали только не понятно мне как рассчитываете ?

ivanenkomaxim
Сообщения: 5
Зарегистрирован: 19 фев 2012, 15:58

Re: общие вопросы по ЦФ

Сообщение ivanenkomaxim »

У меня определена структура комплексных чисел, где перегружены операции +, -, *, / для комплексных переменных. Вот так выглядит структура комплексных чисел:

Код: Выделить всё

    public struct Complex
    {
        public double Re;
        public double Im;

        public Complex(double Re, double Im)
        {
            this.Re = Re;
            this.Im = Im;
        }
        public static double Sqr(double x)
        {
            return x * x;
        }
        public static Complex operator + (Complex A, Complex B) //A+B=C
        {
            Complex C = new Complex();
            C.Re = A.Re + B.Re;
            C.Im = A.Im + B.Im;
            return C;
        }
        public static Complex operator -(Complex A, Complex B) //A-B=C
        {
            Complex C = new Complex();
            C.Re = A.Re - B.Re;
            C.Im = A.Im - B.Im;
            return C;
        }
        public static Complex operator *(Complex A, Complex B) //A*B=C
        {
            Complex C = new Complex();
            C.Re = A.Re * B.Re - A.Im * B.Im;
            C.Im = A.Im * B.Re + A.Re * B.Im;
            return C;
        }
        public static Complex operator /(Complex A, Complex B) //A/B=C
        {
            Complex C = new Complex();
            C.Re = (A.Re * B.Re + A.Im * B.Im) / (Sqr(B.Re) + Sqr(B.Im));
            C.Im = (A.Im * B.Re - A.Re * B.Im) / (Sqr(B.Re) + Sqr(B.Im));
            return C;
        }
    }
С помощью этого кода я вычисляю акрсинус комплексного числа.

Код: Выделить всё

        public static double Sqr(double x)
        {
            return x * x;
        }
        public static Complex Sqr(Complex A)
        {
            Complex C = new Complex();
            C.Re = A.Re * A.Re - A.Im * A.Im;
            C.Im = 2 * A.Im * A.Re;
            return C;
        }
        public static Complex Sqrt(Complex A)
        {
            Complex C = new Complex();
            C.Re = Math.Sqrt((Math.Sqrt(Sqr(A.Re) + Sqr(A.Im)) + A.Re) / 2.0);
            C.Im = Math.Sign(A.Im) * Math.Sqrt((Math.Sqrt(Sqr(A.Re) + Sqr(A.Im)) - A.Re) / 2.0);
            return C;
        }
        public static double Mod(Complex A)
        {
            return Math.Sqrt(Sqr(A.Re) + Sqr(A.Im));
        }
        public static double Arg(Complex A)
        {
            double arg;
            if ((A.Re > 0.0) || (A.Im != 0.0))
                arg = 2 * Math.Atan(A.Im / (Math.Sqrt(Sqr(A.Re) + Sqr(A.Im)) + A.Re));
            else
                arg = Math.PI;
            return arg;
        }
        public static Complex Ln(Complex A)
        {
            Complex C = new Complex();
            C.Re = Math.Log(Mod(A));
            C.Im = (Arg(A) != 0) ? Math.Log(Arg(A)) : 0.0;
            return C;
        }
        public static Complex Arcsin(Complex A)
        {
            Complex C = new Complex();
            C = new Complex(-A.Im, A.Re) + Sqrt(new Complex(1.0, 0.0) - Sqr(A));
            C = Ln(C);
            return new Complex(C.Im, -C.Re);
        }
Почему то выдает неверные решения. Проверял по этой статье по формулах (2), (3), (4)

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: общие вопросы по ЦФ

Сообщение Бахурин Сергей »

предполагаю что вы неверно вычисляете . Для комплексного аргумента z это выражение должно быть комплексным. поставьте какую нить мат среду (матлаб или октаву) и проверяйте написанные вами функции на корректность.

ivanenkomaxim
Сообщения: 5
Зарегистрирован: 19 фев 2012, 15:58

Re: общие вопросы по ЦФ

Сообщение ivanenkomaxim »

Да, я знаю что аргумент квадратного корня комплексное число, так же как и результат. Я и использую собственную функцию взятия корня квадратного от комлпексного числа. Хорошо, спасибо, попробую проверить.

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: общие вопросы по ЦФ

Сообщение Santik »

Очень тупой вопрос. А какая должна быть разрядность АЦП, чтобы о 500 Дб можно было говорить? Что-то я не слышал об АЦП более 24 разряда...

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: общие вопросы по ЦФ

Сообщение Бахурин Сергей »

Santik писал(а):Очень тупой вопрос. А какая должна быть разрядность АЦП, чтобы о 500 Дб можно было говорить? Что-то я не слышал об АЦП более 24 разряда...
есть такая оценочная формула для динамического диапазона сигнала на выходе АЦП

D = B*6.02 дБ.

D - динамический диапазон, B - количество разрядов АЦП. Исходя из того что вам требуется D = 500 дБ - вам необходимо B=500/6.02 = 83 разряда АЦП.

Ответить