diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000..4786551
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,15 @@
+Всегда отвечай мне используя русский язык.
+Всегда пиши комментарии в коде на русском языке.
+Комментарии к классам, структурам делегатам и перечислениям, а также к их членам всегда пиши в системном виде.
+При написании комментариев (ели они короткие) в коде предпочитай размещение комментария в конце той же строке, что и сам комментируемый код.
+Старайся избегать тривиальных комментариев.
+При герерации кода старайся минимизировать количество фигурных скобок.
+При генерации кода используй самые современные виды синтаксических конструкций языка.
+Всегда старайся минимизировтаь размер кода если не запрошено иное.
+Используй стиль именования локальных переменных snake_case.
+Используй стиль именования входных переменных методов PascalCase.
+Используй стиль именования полей классов _PascalCase для нестатических переменных и __PascalCase для статических переменных.
+Ппредпочитай английский язык при именовании переменных, методов, классов и прочих сущностей.
+При инициализации массивов, списков и словарей используй выражения инициализации массивов.
+При объявлении переменных предпочитай использовать ключевое слово var.
+При написании системных комментариев старайся писать их компактно в одну строку, если длина текста небольшая.
\ No newline at end of file
diff --git a/MathCore.DSP.sln b/MathCore.DSP.sln
index 5f3a007..c2b7d28 100644
--- a/MathCore.DSP.sln
+++ b/MathCore.DSP.sln
@@ -23,6 +23,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfTest", "Tests\WpfTest\Wp
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Benchmarks", "Tests\Benchmarks\Benchmarks.csproj", "{6E552E38-1B68-4DBD-9DAB-03FF2A0A4F06}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Service", ".Service", "{2507A7F8-E9DD-CD81-FF78-9340A71A364C}"
+ ProjectSection(SolutionItems) = preProject
+ .github\copilot-instructions.md = .github\copilot-instructions.md
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
diff --git a/MathCore.DSP.sln.DotSettings b/MathCore.DSP.sln.DotSettings
index ca2c99e..9e2dae0 100644
--- a/MathCore.DSP.sln.DotSettings
+++ b/MathCore.DSP.sln.DotSettings
@@ -8,6 +8,7 @@
FT
II
PNG
+ RC
True
True
True
diff --git a/MathCore.DSP/Filters/Builders/BandPassBuilder.cs b/MathCore.DSP/Filters/Builders/BandPassBuilder.cs
index 418f8d4..8c41bca 100644
--- a/MathCore.DSP/Filters/Builders/BandPassBuilder.cs
+++ b/MathCore.DSP/Filters/Builders/BandPassBuilder.cs
@@ -1,3 +1,5 @@
namespace MathCore.DSP.Filters.Builders;
+/// Построитель полосно-пропускающего фильтра
+/// Период дискретизации
public readonly record struct BandPassBuilder(double dt);
diff --git a/MathCore.DSP/Filters/Builders/BandStopBuilder.cs b/MathCore.DSP/Filters/Builders/BandStopBuilder.cs
index d6254c0..656bab3 100644
--- a/MathCore.DSP/Filters/Builders/BandStopBuilder.cs
+++ b/MathCore.DSP/Filters/Builders/BandStopBuilder.cs
@@ -1,3 +1,5 @@
namespace MathCore.DSP.Filters.Builders;
+/// Построитель полосно-задерживающего фильтра
+/// Период дискретизации
public readonly record struct BandStopBuilder(double dt);
diff --git a/MathCore.DSP/Filters/Builders/ButterworthBuilder.cs b/MathCore.DSP/Filters/Builders/ButterworthBuilder.cs
index 44ddcc5..238cb34 100644
--- a/MathCore.DSP/Filters/Builders/ButterworthBuilder.cs
+++ b/MathCore.DSP/Filters/Builders/ButterworthBuilder.cs
@@ -1,81 +1,53 @@
namespace MathCore.DSP.Filters.Builders;
+/// Построитель фильтра Батерворта
public readonly ref struct ButterworthBuilder
{
+ /// Тип пропускания полосы частот
public FrequencyPassType PassType { get; init; }
+ /// Период дискретизации фильтра
public double dt { get; init; }
+ /// Частота дискретизации фильтра
public double fd { get => 1 / dt; init => dt = 1 / value; }
+ /// Фильтр нижних частот
public ButterworthBuilder LowPass => this with { PassType = FrequencyPassType.LowPass };
+
+ /// Фильтр верхних частот
public ButterworthBuilder HighPass => this with { PassType = FrequencyPassType.HighPass };
+
+ /// Полосопропускающий фильтр
public ButterworthBuilder BandPass => this with { PassType = FrequencyPassType.BandPass };
+
+ /// Полосозадерживающий фильтр
public ButterworthBuilder BandStop => this with { PassType = FrequencyPassType.BandStop };
- private readonly double? _PassFrequency;
- private readonly double? _StopFrequency;
- private readonly double? _PassHighFrequency;
- private readonly double? _StopHighFrequency;
-
- private readonly int? _Order;
-
- private readonly double? _Gp;
- private readonly double? _Gs;
- private readonly double? _Rp;
- private readonly double? _Rs;
-
- public double? PassFrequency
- {
- get => _PassFrequency;
- init => _PassFrequency = value;
- }
-
- public double? StopFrequency
- {
- get => _StopFrequency;
- init => _StopFrequency = value;
- }
-
- public double? PassHighFrequency
- {
- get => _PassHighFrequency;
- init => _PassHighFrequency = value;
- }
-
- public double? StopHighFrequency
- {
- get => _StopHighFrequency;
- init => _StopHighFrequency = value;
- }
-
- public int? Order
- {
- get => _Order;
- init => _Order = value;
- }
-
- public double? Gp
- {
- get => _Gp;
- init => _Gp = value;
- }
-
- public double? Gs
- {
- get => _Gs;
- init => _Gs = value;
- }
-
- public double? Rp
- {
- get => _Rp;
- init => _Rp = value;
- }
-
- public double? Rs
- {
- get => _Rs;
- init => _Rs = value;
- }
+ /// Частота пропускания
+ public double? PassFrequency { get; init; }
+
+ /// Частота заграждения
+ public double? StopFrequency { get; init; }
+
+ /// Верхняя частота пропускания
+ public double? PassHighFrequency { get; init; }
+
+ /// Верхняя частота заграждения
+ public double? StopHighFrequency { get; init; }
+
+ /// Порядок фильтра
+ public int? Order { get; init; }
+
+ /// Коэффициент пропускания
+ public double? Gp { get; init; }
+
+ /// Коэффициент заграждения
+ public double? Gs { get; init; }
+
+ /// Неравномерность в полосе пропускания
+ public double? Rp { get; init; }
+
+ /// Неравномерность в полосе заграждения
+ public double? Rs { get; init; }
}
\ No newline at end of file
diff --git a/MathCore.DSP/Filters/Builders/ChebyshevBuilder.cs b/MathCore.DSP/Filters/Builders/ChebyshevBuilder.cs
index a49e028..f101259 100644
--- a/MathCore.DSP/Filters/Builders/ChebyshevBuilder.cs
+++ b/MathCore.DSP/Filters/Builders/ChebyshevBuilder.cs
@@ -1,83 +1,56 @@
namespace MathCore.DSP.Filters.Builders;
+/// Строитель фильтров Чебышева
public readonly ref struct ChebyshevBuilder
{
+ /// Тип пропускания полосы частот
public FrequencyPassType PassType { get; init; }
+ /// Период дискретизации
public double dt { get; init; }
+ /// Частота дискретизации
public double fd { get => 1 / dt; init => dt = 1 / value; }
+ /// Тип фильтра Чебышева
public ChebyshevType Type { get; init; }
+ /// ФНЧ
public ChebyshevBuilder LowPass => this with { PassType = FrequencyPassType.LowPass };
+
+ /// ФВЧ
public ChebyshevBuilder HighPass => this with { PassType = FrequencyPassType.HighPass };
+
+ /// ППФ
public ChebyshevBuilder BandPass => this with { PassType = FrequencyPassType.BandPass };
+
+ /// ПЗФ
public ChebyshevBuilder BandStop => this with { PassType = FrequencyPassType.BandStop };
- private readonly double? _PassFrequency;
- private readonly double? _StopFrequency;
- private readonly double? _PassHighFrequency;
- private readonly double? _StopHighFrequency;
-
- private readonly int? _Order;
-
- private readonly double? _Gp;
- private readonly double? _Gs;
- private readonly double? _Rp;
- private readonly double? _Rs;
-
- public double? PassFrequency
- {
- get => _PassFrequency;
- init => _PassFrequency = value;
- }
-
- public double? StopFrequency
- {
- get => _StopFrequency;
- init => _StopFrequency = value;
- }
-
- public double? PassHighFrequency
- {
- get => _PassHighFrequency;
- init => _PassHighFrequency = value;
- }
-
- public double? StopHighFrequency
- {
- get => _StopHighFrequency;
- init => _StopHighFrequency = value;
- }
-
- public int? Order
- {
- get => _Order;
- init => _Order = value;
- }
-
- public double? Gp
- {
- get => _Gp;
- init => _Gp = value;
- }
-
- public double? Gs
- {
- get => _Gs;
- init => _Gs = value;
- }
-
- public double? Rp
- {
- get => _Rp;
- init => _Rp = value;
- }
-
- public double? Rs
- {
- get => _Rs;
- init => _Rs = value;
- }
+ /// Частота пропускания
+ public double? PassFrequency { get; init; }
+
+ /// Частота заграждения
+ public double? StopFrequency { get; init; }
+
+ /// Верхняя частота пропускания
+ public double? PassHighFrequency { get; init; }
+
+ /// Верхняя частота заграждения
+ public double? StopHighFrequency { get; init; }
+
+ /// Порядок фильтра
+ public int? Order { get; init; }
+
+ /// Коэффициент передачи в полосе пропускания
+ public double? Gp { get; init; }
+
+ /// Коэффициент передачи в полосе заграждения
+ public double? Gs { get; init; }
+
+ /// Неравномерность в полосе пропускания (дБ)
+ public double? Rp { get; init; }
+
+ /// Затухание в полосе заграждения (дБ)
+ public double? Rs { get; init; }
}
\ No newline at end of file
diff --git a/MathCore.DSP/Filters/Builders/EllipticBuilder.cs b/MathCore.DSP/Filters/Builders/EllipticBuilder.cs
index dc8d3aa..ebfd7fa 100644
--- a/MathCore.DSP/Filters/Builders/EllipticBuilder.cs
+++ b/MathCore.DSP/Filters/Builders/EllipticBuilder.cs
@@ -1,81 +1,53 @@
namespace MathCore.DSP.Filters.Builders;
+/// Строитель эллиптических фильтров
public readonly ref struct EllipticBuilder
{
+ /// Тип пропускания полосы частот
public FrequencyPassType PassType { get; init; }
+ /// Период дискретизации
public double dt { get; init; }
+ /// Частота дискретизации
public double fd { get => 1 / dt; init => dt = 1 / value; }
+ /// ФНЧ
public EllipticBuilder LowPass => this with { PassType = FrequencyPassType.LowPass };
+
+ /// ФВЧ
public EllipticBuilder HighPass => this with { PassType = FrequencyPassType.HighPass };
+
+ /// ППФ
public EllipticBuilder BandPass => this with { PassType = FrequencyPassType.BandPass };
+
+ /// ПЗФ
public EllipticBuilder BandStop => this with { PassType = FrequencyPassType.BandStop };
- private readonly double? _PassFrequency;
- private readonly double? _StopFrequency;
- private readonly double? _PassHighFrequency;
- private readonly double? _StopHighFrequency;
-
- private readonly int? _Order;
-
- private readonly double? _Gp;
- private readonly double? _Gs;
- private readonly double? _Rp;
- private readonly double? _Rs;
-
- public double? PassFrequency
- {
- get => _PassFrequency;
- init => _PassFrequency = value;
- }
-
- public double? StopFrequency
- {
- get => _StopFrequency;
- init => _StopFrequency = value;
- }
-
- public double? PassHighFrequency
- {
- get => _PassHighFrequency;
- init => _PassHighFrequency = value;
- }
-
- public double? StopHighFrequency
- {
- get => _StopHighFrequency;
- init => _StopHighFrequency = value;
- }
-
- public int? Order
- {
- get => _Order;
- init => _Order = value;
- }
-
- public double? Gp
- {
- get => _Gp;
- init => _Gp = value;
- }
-
- public double? Gs
- {
- get => _Gs;
- init => _Gs = value;
- }
-
- public double? Rp
- {
- get => _Rp;
- init => _Rp = value;
- }
-
- public double? Rs
- {
- get => _Rs;
- init => _Rs = value;
- }
+ /// Частота пропускания
+ public double? PassFrequency { get; init; }
+
+ /// Частота заграждения
+ public double? StopFrequency { get; init; }
+
+ /// Верхняя частота пропускания
+ public double? PassHighFrequency { get; init; }
+
+ /// Верхняя частота заграждения
+ public double? StopHighFrequency { get; init; }
+
+ /// Порядок фильтра
+ public int? Order { get; init; }
+
+ /// Коэффициент передачи в полосе пропускания
+ public double? Gp { get; init; }
+
+ /// Коэффициент передачи в полосе заграждения
+ public double? Gs { get; init; }
+
+ /// Неравномерность в полосе пропускания (дБ)
+ public double? Rp { get; init; }
+
+ /// Затухание в полосе заграждения (дБ)
+ public double? Rs { get; init; }
}
\ No newline at end of file
diff --git a/MathCore.DSP/Filters/Builders/FrequencyPassType.cs b/MathCore.DSP/Filters/Builders/FrequencyPassType.cs
index 6c3223b..949ab24 100644
--- a/MathCore.DSP/Filters/Builders/FrequencyPassType.cs
+++ b/MathCore.DSP/Filters/Builders/FrequencyPassType.cs
@@ -1,9 +1,14 @@
namespace MathCore.DSP.Filters.Builders;
+/// Тип пропускания полосы частот
public enum FrequencyPassType
{
+ /// ФНЧ
LowPass,
+ /// ФВЧ
HighPass,
+ /// ППФ
BandPass,
+ /// ПЗФ
BandStop
}
\ No newline at end of file
diff --git a/MathCore.DSP/Filters/Builders/HighPassBuilder.cs b/MathCore.DSP/Filters/Builders/HighPassBuilder.cs
index 862f23b..c6d4903 100644
--- a/MathCore.DSP/Filters/Builders/HighPassBuilder.cs
+++ b/MathCore.DSP/Filters/Builders/HighPassBuilder.cs
@@ -1,29 +1,50 @@
namespace MathCore.DSP.Filters.Builders;
+/// Строитель фильтров верхних частот
+/// Период дискретизации
public readonly record struct HighPassBuilder(double dt)
{
+ /// Создать строитель фильтра Баттерворта верхних частот
+ /// Частота заграждения
+ /// Частота пропускания
+ /// Коэффициент передачи в полосе пропускания
+ /// Коэффициент передачи в полосе заграждения
public HighPassButterworthBuilder Butterworth(double fs, double fp, double Gp, double Gs) => new(dt, fs, fp, Gp, Gs);
+ /// Создать строитель фильтра Чебышева верхних частот
+ /// Частота заграждения
+ /// Частота пропускания
+ /// Коэффициент передачи в полосе пропускания
+ /// Коэффициент передачи в полосе заграждения
public HighPassChebyshevBuilder Chebyshev(double fs, double fp, double Gp, double Gs) => new(dt, fs, fp, Gp, Gs);
}
+/// Строитель фильтра Баттерворта верхних частот
+/// Период дискретизации /// Частота заграждения
+/// Частота заграждения
+/// Частота пропускания
+/// Коэффициент передачи в полосе пропускания
+/// Коэффициент передачи в полосе заграждения
public readonly record struct HighPassButterworthBuilder(double dt, double fs, double fp, double Gp, double Gs)
{
+ /// Создать фильтр Баттерворта верхних частот
public ButterworthHighPass Create() => new(dt, fp, fs, Gp, Gs);
+ /// Неявное преобразование в фильтр
public static implicit operator Filter(HighPassButterworthBuilder builder) => builder.Create();
}
+/// Строитель фильтра Чебышева верхних частот
+/// Период дискретизации
+/// Частота заграждения
+/// Частота пропускания
+/// Коэффициент передачи в полосе пропускания
+/// Коэффициент передачи в полосе заграждения
public readonly record struct HighPassChebyshevBuilder(double dt, double fs, double fp, double Gp, double Gs)
{
- public ChebyshevHighPass Create() => new(dt, fp, fs, Gp, Gs);
+ /// Создать фильтр Чебышева верхних частот
+ public ChebyshevHighPass Create() => new(dt, fs, fp, Gp, Gs);
+ /// Неявное преобразование в фильтр
public static implicit operator Filter(HighPassChebyshevBuilder builder) => builder.Create();
}
-
-public readonly record struct HighPassEllipticBuilder(double dt, double fs, double fp, double Gp, double Gs)
-{
- public EllipticHighPass Create() => new(dt, fp, fs, Gp, Gs);
-
- public static implicit operator Filter(HighPassEllipticBuilder builder) => builder.Create();
-}
diff --git a/MathCore.DSP/Filters/Builders/LowPassBuilder.cs b/MathCore.DSP/Filters/Builders/LowPassBuilder.cs
index 9933e0c..f995e11 100644
--- a/MathCore.DSP/Filters/Builders/LowPassBuilder.cs
+++ b/MathCore.DSP/Filters/Builders/LowPassBuilder.cs
@@ -1,48 +1,98 @@
namespace MathCore.DSP.Filters.Builders;
+/// Строитель фильтров нижних частот
+/// Период дискретизации
public readonly record struct LowPassBuilder(double dt)
{
+ /// Создать строитель фильтра Баттерворта нижних частот
+ /// Частота заграждения
+ /// Частота пропускания
+ /// Коэффициент передачи в полосе пропускания
+ /// Коэффициент передачи в полосе заграждения
public LowPassButterworthBuilder Butterworth(double fs, double fp, double Gp, double Gs) => new(dt, fs, fp, Gp, Gs);
+ /// Создать строитель фильтра Чебышева нижних частот
+ /// Частота заграждения
+ /// Частота пропускания
+ /// Коэффициент передачи в полосе пропускания
+ /// Коэффициент передачи в полосе заграждения
public LowPassChebyshevBuilder Chebyshev(double fs, double fp, double Gp, double Gs) => new(dt, fs, fp, Gp, Gs);
+ /// Создать строитель RC-фильтра нижних частот
+ /// Частота среза
public LowPassRCBuilder RC(double f0) => new(dt, f0);
+ /// Создать строитель RC-фильтра нижних частот с экспоненциальной аппроксимацией
+ /// Частота среза
public LowPassRCExponentialBuilder RCExponential(double f0) => new(dt, f0);
}
+/// Строитель фильтра Баттерворта нижних частот
+/// Период дискретизации
+/// Частота заграждения
+/// Частота пропускания
+/// Коэффициент передачи в полосе пропускания
+/// Коэффициент передачи в полосе заграждения
public readonly record struct LowPassButterworthBuilder(double dt, double fs, double fp, double Gp, double Gs)
{
+ /// Создать фильтр Баттерворта нижних частот
public ButterworthLowPass Create() => new(dt, fp, fs, Gp, Gs);
+ /// Неявное преобразование в фильтр
public static implicit operator Filter(LowPassButterworthBuilder builder) => builder.Create();
}
+/// Строитель фильтра Чебышева нижних частот
+/// Период дискретизации
+/// Частота заграждения
+/// Частота пропускания
+/// Коэффициент передачи в полосе пропускания
+/// Коэффициент передачи в полосе заграждения
public readonly record struct LowPassChebyshevBuilder(double dt, double fs, double fp, double Gp, double Gs)
{
+ /// Создать фильтр Чебышева нижних частот
public ChebyshevLowPass Create() => new(dt, fp, fs, Gp, Gs);
+ /// Неявное преобразование в фильтр
public static implicit operator Filter(LowPassChebyshevBuilder builder) => builder.Create();
}
+/// Строитель эллиптического фильтра нижних частот
+/// Период дискретизации
+/// Частота заграждения
+/// Частота пропускания
+/// Коэффициент передачи в полосе пропускания
+/// Коэффициент передачи в полосе заграждения
public readonly record struct LowPassEllipticBuilder(double dt, double fs, double fp, double Gp, double Gs)
{
+ /// Создать эллиптический фильтр нижних частот
public EllipticLowPass Create() => new(dt, fp, fs, Gp, Gs);
+ /// Неявное преобразование в фильтр
public static implicit operator Filter(LowPassEllipticBuilder builder) => builder.Create();
}
+/// Строитель RC-фильтра нижних частот
+/// Период дискретизации
+/// Частота среза
public readonly record struct LowPassRCBuilder(double dt, double f0)
{
+ /// Создать RC-фильтр нижних частот
public RCLowPass Create() => new(dt, f0);
+ /// Неявное преобразование в фильтр
public static implicit operator Filter(LowPassRCBuilder builder) => builder.Create();
}
+/// Строитель RC-фильтра нижних частот с экспоненциальной аппроксимацией
+/// Период дискретизации
+/// Частота среза
public readonly record struct LowPassRCExponentialBuilder(double dt, double f0)
{
+ /// Создать RC-фильтр нижних частот с экспоненциальной аппроксимацией
public RCExponentialLowPass Create() => new(dt, f0);
+ /// Неявное преобразование в фильтр
public static implicit operator Filter(LowPassRCExponentialBuilder builder) => builder.Create();
}
diff --git a/MathCore.DSP/Filters/ChebyshevType.cs b/MathCore.DSP/Filters/ChebyshevType.cs
index 7209f01..849d11a 100644
--- a/MathCore.DSP/Filters/ChebyshevType.cs
+++ b/MathCore.DSP/Filters/ChebyshevType.cs
@@ -7,6 +7,6 @@ public enum ChebyshevType : byte
I,
/// Фильтр Чебышева второго рода, подавляющий верхнюю область частот (выше fp)
II,
- /// Фильтр Чебышева второго рода c коррекцией частотного диапазона, подавляющий верхнюю область частот (выше fs)
+ /// Фильтр Чебышева второго рода с коррекцией частотного диапазона, подавляющий верхнюю область частот (выше fs)
IICorrected
}
\ No newline at end of file
diff --git a/MathCore.DSP/MathCore.DSP.csproj b/MathCore.DSP/MathCore.DSP.csproj
index b4847ed..bed790e 100644
--- a/MathCore.DSP/MathCore.DSP.csproj
+++ b/MathCore.DSP/MathCore.DSP.csproj
@@ -8,7 +8,7 @@
false
preview
- 0.0.14.1
+ 0.0.14.2
enable
Обновление пакетов
@@ -52,9 +52,9 @@
-
-
-
+
+
+
diff --git a/Tests/Benchmarks/Benchmarks.csproj b/Tests/Benchmarks/Benchmarks.csproj
index 0bfd684..aec5e65 100644
--- a/Tests/Benchmarks/Benchmarks.csproj
+++ b/Tests/Benchmarks/Benchmarks.csproj
@@ -18,7 +18,7 @@
-
+
diff --git a/Tests/MathCore.DSP.Tests/MathCore.DSP.Tests.csproj b/Tests/MathCore.DSP.Tests/MathCore.DSP.Tests.csproj
index 1a3b1fb..7607299 100644
--- a/Tests/MathCore.DSP.Tests/MathCore.DSP.Tests.csproj
+++ b/Tests/MathCore.DSP.Tests/MathCore.DSP.Tests.csproj
@@ -26,9 +26,9 @@
-
-
-
+
+
+
diff --git a/Tests/WpfTest/WpfTest.csproj b/Tests/WpfTest/WpfTest.csproj
index 03541d3..2f31b15 100644
--- a/Tests/WpfTest/WpfTest.csproj
+++ b/Tests/WpfTest/WpfTest.csproj
@@ -9,8 +9,8 @@
-
-
+
+