общие вопросы по ЦФ
Re: общие вопросы по ЦФ
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.
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.
-
- Сообщения: 5
- Зарегистрирован: 19 фев 2012, 15:58
Преобразование ФНЧ-ФВЧ
Здравствуйте! Столкнулся с проблемой при преобразовании ФНЧ-ФВЧ. Вот код на языке C# для вычисления коэффициентов фильтра Баттерворта из примера для ФНЧ:
В этом случае вычисления проходят успешно, АЧХ выглядит так.
Тем не менее, в статье по формуле (10) и (11) успешно вычислить у меня не удается:
В результате у меня получается совсем не фильтр верхних частот, а какой-то некорректный ФНЧ.
Подскажите, пожалуйста, что я упустил, может быть есть еще дополнительные преобразования частот? Есть ли у Вас возможность предоставить часть кода, в которой происходит преобразование ФНЧ-ФВЧ?
Код: Выделить всё
//Коридор АЧХ
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/коэфф. Почитайте про дробнорациональную подстановку.
подставляю s = 0.5/s получаем:
Это совсем не то что просто все коэффициенты пересчитать по формуле 0.5/коэфф. Почитайте про дробнорациональную подстановку.
-
- Сообщения: 5
- Зарегистрирован: 19 фев 2012, 15:58
Re: общие вопросы по ЦФ
Спасибо большое! Я действительно не учел этого, и теперь все исправил - преобразование ФНЧ-ФВЧ работает!Бахурин Сергей писал(а):думаю вы неправильно делаете подстановку. Вот например
подставляю s = 0.5/s получаем:
Это совсем не то что просто все коэффициенты пересчитать по формуле 0.5/коэфф. Почитайте про дробнорациональную подстановку.
Хотелось бы задать вопрос о преобразовании Ландена обратного эллиптического синуса для расчета эллиптического ФНЧ. Дело в том, что в этой статье по формуле (23) рассчитываются обратные эллиптические функции. Для действительных чисел у меня все работает, а вот для комплексных не могу реализовать функцию arcsin от комплексного числа:
Что в этой формуле значит ? Я сделал так:
Логарифм от комплексного числа реализовал так:
Из-за этого арксинуса не могу закончить эллиптический фильтр. Могли бы Вы помочь мне и сказать где я ошибаюсь? Заранее благодарен.
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: общие вопросы по ЦФ
вроде как правильно все сделали только не понятно мне как рассчитываете ?
-
- Сообщения: 5
- Зарегистрирован: 19 фев 2012, 15:58
Re: общие вопросы по ЦФ
У меня определена структура комплексных чисел, где перегружены операции +, -, *, / для комплексных переменных. Вот так выглядит структура комплексных чисел:
С помощью этого кода я вычисляю акрсинус комплексного числа.
Почему то выдает неверные решения. Проверял по этой статье по формулах (2), (3), (4)
Код: Выделить всё
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);
}
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: общие вопросы по ЦФ
предполагаю что вы неверно вычисляете . Для комплексного аргумента z это выражение должно быть комплексным. поставьте какую нить мат среду (матлаб или октаву) и проверяйте написанные вами функции на корректность.
-
- Сообщения: 5
- Зарегистрирован: 19 фев 2012, 15:58
Re: общие вопросы по ЦФ
Да, я знаю что аргумент квадратного корня комплексное число, так же как и результат. Я и использую собственную функцию взятия корня квадратного от комлпексного числа. Хорошо, спасибо, попробую проверить.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: общие вопросы по ЦФ
Очень тупой вопрос. А какая должна быть разрядность АЦП, чтобы о 500 Дб можно было говорить? Что-то я не слышал об АЦП более 24 разряда...
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: общие вопросы по ЦФ
есть такая оценочная формула для динамического диапазона сигнала на выходе АЦПSantik писал(а):Очень тупой вопрос. А какая должна быть разрядность АЦП, чтобы о 500 Дб можно было говорить? Что-то я не слышал об АЦП более 24 разряда...
D = B*6.02 дБ.
D - динамический диапазон, B - количество разрядов АЦП. Исходя из того что вам требуется D = 500 дБ - вам необходимо B=500/6.02 = 83 разряда АЦП.