Skip to content

Commit fe1df8a

Browse files
committed
v0.0.15 - Миграция на .NET10 + комментарии в коде и описания
1 parent f5ca0a2 commit fe1df8a

36 files changed

Lines changed: 1352 additions & 329 deletions

MathCore.DSP/DoubleArrayDSPExtensions.cs

Lines changed: 132 additions & 135 deletions
Large diffs are not rendered by default.

MathCore.DSP/Filters/Builders/HighPassBuilder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
namespace MathCore.DSP.Filters.Builders;
1+
// ReSharper disable InconsistentNaming
2+
namespace MathCore.DSP.Filters.Builders;
23

34
/// <summary>Строитель фильтров верхних частот</summary>
45
/// <param name="dt">Период дискретизации</param>
@@ -20,7 +21,7 @@ public readonly record struct HighPassBuilder(double dt)
2021
}
2122

2223
/// <summary>Строитель фильтра Баттерворта верхних частот</summary>
23-
/// <param name="dt">Период дискретизации</param> /// <param name="fs">Частота заграждения</param>
24+
/// <param name="dt">Период дискретизации</param>
2425
/// <param name="fs">Частота заграждения</param>
2526
/// <param name="fp">Частота пропускания</param>
2627
/// <param name="Gp">Коэффициент передачи в полосе пропускания</param>
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# Builders фильтров
2+
3+
Директория содержит набор "строителей" (Builder-типы) для создания дискретных цифровых фильтров различных семейств (Баттерворта, Чебышева, эллиптических и простых RC) с параметризацией через удобный fluent/record‑подход.
4+
5+
## Назначение
6+
Builder-структуры инкапсулируют параметры проектирования фильтра (тип полосы пропускания, частоты, коэффициенты усиления/затухания, порядок и допуски) и подготавливают экземпляры конечных фильтров (`Filter`) через метод `Create()` или неявное преобразование оператора `implicit`.
7+
8+
## Состав
9+
- `FrequencyPassType` – перечисление типов полосы: ФНЧ, ФВЧ, ППФ, ПЗФ
10+
- Универсальные ref builders (параметрические без метода создания в текущей версии):
11+
- `ButterworthBuilder`
12+
- `ChebyshevBuilder`
13+
- `EllipticBuilder`
14+
- Специализированные builders нижних частот:
15+
- `LowPassBuilder` – корневой строитель; производные:
16+
- `LowPassButterworthBuilder`
17+
- `LowPassChebyshevBuilder`
18+
- `LowPassEllipticBuilder`
19+
- `LowPassRCBuilder` (RC-фильтр первого порядка)
20+
- `LowPassRCExponentialBuilder` (вариант с экспоненциальной аппроксимацией)
21+
- Специализированные builders верхних частот:
22+
- `HighPassBuilder` – корневой строитель; производные:
23+
- `HighPassButterworthBuilder`
24+
- `HighPassChebyshevBuilder`
25+
- Заготовки полосных фильтров:
26+
- `BandPassBuilder`
27+
- `BandStopBuilder`
28+
29+
## Общие параметры
30+
Большинство builders оперируют:
31+
- `dt` – период дискретизации (сек)
32+
- `fd` – частота дискретизации (Гц) (взаимосвязана с `dt`)
33+
- `fp`, `fs` – граничные частоты пропускания / заграждения
34+
- `Gp`, `Gs` – коэффициенты передачи в полосах (линейные, не в дБ)
35+
- `Rp`, `Rs` – неравномерность (ripples) / затухание (дБ)
36+
- `Order` – желаемый порядок (если требуется принудительно)
37+
38+
## Использование
39+
### Пример: ФНЧ Баттерворта
40+
```csharp
41+
var dt = 1 / 8000d; // период дискретизации
42+
var builder = new LowPassBuilder(dt)
43+
.Butterworth(fs: 1500, fp: 1000, Gp: 1, Gs: 0.1);
44+
45+
Filter filter = builder; // неявное преобразование
46+
// Или явное создание:
47+
var bw_lp = builder.Create();
48+
```
49+
### Пример: ФВЧ Чебышева
50+
```csharp
51+
var dt = 1 / 44100d;
52+
var cheb_hp_builder = new HighPassBuilder(dt)
53+
.Chebyshev(fs: 500, fp: 1000, Gp: 1, Gs: 0.05);
54+
55+
Filter cheb_hp = cheb_hp_builder; // implicit
56+
```
57+
### Пример: RC фильтр нижних частот
58+
```csharp
59+
var dt = 1 / 1000d;
60+
var rc_builder = new LowPassBuilder(dt).RC(f0: 10);
61+
Filter rc = rc_builder; // создание RC фильтра
62+
```
63+
### Пример: RC экспоненциальный
64+
```csharp
65+
var dt = 1 / 1000d;
66+
var rc_exp_builder = new LowPassBuilder(dt).RCExponential(f0: 10);
67+
Filter rc_exp = rc_exp_builder;
68+
```
69+
70+
## Особенности
71+
- Запись через `record struct` облегчает иммутабельность и копирование с изменением (`with`)
72+
- Неявные операторы преобразования упрощают получение готового фильтра
73+
- Для универсальных builders (`ButterworthBuilder`, `ChebyshevBuilder`, `EllipticBuilder`) далее может быть расширена функциональность методами расчёта и генерации коэффициентов
74+
75+
## План расширений
76+
1. Реализация методов `Create()` для универсальных builders с автоматическим подбором порядка по допускам
77+
2. Добавление полосных (ППФ/ПЗФ) вариантов с расчётом преобразования частот
78+
3. Включение генерации АЧХ/ФЧХ/Импульсной характеристики прямо из builder
79+
80+
## Быстрый старт
81+
1. Выберите базовый builder по типу полосы (`LowPassBuilder`, `HighPassBuilder` и т.д.)
82+
2. Вызовите метод семейства фильтра (`Butterworth`, `Chebyshev`, `RC` ...)
83+
3. Неявно преобразуйте к `Filter` или вызовите `Create()`
84+
4. Используйте полученный фильтр для обработки выборок (методы исходного класса `Filter`)
85+
86+
---
87+
При добавлении новых типов фильтров выдерживайте единый стиль: минимализм, иммутабельность параметров, русские XML‑комментарии и неявный оператор преобразования к `Filter`.

MathCore.DSP/Filters/readme.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# Фильтры Баттерворта
2+
3+
Главные особенности:
4+
- АЧХ в полосе пропускания без ряби (maximally flat)
5+
- Переходная полоса шире при равных допусках, чем у Чебышева и эллиптических
6+
- Порядок выше, чем у Чебышева/эллиптических для тех же `Rp`, `Rs`
7+
- Фаза более гладкая, чем у Чебышева и эллиптических
8+
- Выбор: когда важны ровность амплитуды и умеренная фазовая гладкость, а минимальная крутизна не критична
9+
10+
Реализации:
11+
- ФНЧ: `ButterworthLowPass`
12+
- ФВЧ: `ButterworthHighPass`
13+
- ППФ: `ButterworthBandPass`
14+
- ПЗФ: `ButterworthBandStop`
15+
16+
# Фильтры Чебышева
17+
18+
Главные особенности:
19+
- Типы (роды): I (рябь в passband), II (рябь в stopband), IICorrected (корректированный II)
20+
- Уже переходная полоса при меньшем порядке, чем у Баттерворта
21+
- Рябь только в одной из полос (в зависимости от рода)
22+
- Фаза менее гладкая, возможны колебания групповой задержки
23+
- Выбор: когда нужна повышенная крутизна и допустима рябь в строго одной полосе
24+
25+
Реализации:
26+
- ФНЧ: `ChebyshevLowPass` (типы I/II/IICorrected)
27+
- ФВЧ: `ChebyshevHighPass` (типы I/II/IICorrected)
28+
- ППФ: `ChebyshevBandPass` (типы I/II/IICorrected)
29+
- ПЗФ: `ChebyshevBandStop` (типы I/II/IICorrected)
30+
31+
# Эллиптические (Кауэра) фильтры
32+
33+
Главные особенности:
34+
- Рябь (equiripple) одновременно в полосе пропускания и заграждения
35+
- Минимальный порядок для заданных допусков `Rp`, `Rs`
36+
- Самая узкая переходная полоса (максимальная крутизна)
37+
- Наихудшая линейность фазы среди реализованных типов
38+
- Выбор: когда критичны минимальный порядок и максимальная селективность, фазовая нелинейность некритична или компенсируется
39+
40+
Реализации:
41+
- ФНЧ: `EllipticLowPass`
42+
- ФВЧ: `EllipticHighPass`
43+
- ППФ: `EllipticBandPass`
44+
- ПЗФ: `EllipticBandStop`
45+
46+
# RC / RLC фильтры (простые прототипы)
47+
48+
Назначение: быстрота расчёта, минимальная сложность, удобны как справочные/базовые элементы или для предварительной фильтрации.
49+
50+
## RC‑цепочка (ФНЧ)
51+
- `RCLowPass`: билинейное преобразование RC‑прототипа (1 полюс). Плавный спад, −3дБ на частоте среза, монотонная АЧХ.
52+
- `RCExponentialLowPass`: экспоненциальная аппроксимация (использует экспоненту для расчёта коэффициента затухания), аналог одношагового сглаживания.
53+
54+
## RLC‑резонансные
55+
- `RLCBandPass`: полосопропускающий (резонансный) фильтр второго порядка, задаётся центральной частотой `f0` и шириной полосы `DeltaF` (по уровню 0.707).
56+
- `RLCBandStop`: полосозаграждающий (notch) фильтр второго порядка, подавляет узкую резонансную полосу вокруг `f0`.
57+
58+
Особенности:
59+
- Низкий порядок (1–2) обеспечивает минимальную задержку и простоту реализации
60+
- Крутизна ограничена; для строгих допусков используются Баттерворт/Чебышев/Эллиптические
61+
- Подходят для быстрой фильтрации / подавления одиночной помехи или сглаживания
62+
63+
# БИХ базовый класс
64+
65+
## `IIR`
66+
- Общий каркас IIR‑фильтра: хранение коэффициентов A (знаменатель) и B (числитель)
67+
- Метод `Process` реализует одношаговую рекуррентную фильтрацию (difference equation)
68+
- Методы частотного отклика и операции структурного соединения:
69+
- `ConnectionSerialTo(IIR)`: последовательное соединение (свёртка полиномов)
70+
- `ConnectionParallelTo(IIR)`: параллельное соединение (сумма откликов с нормировкой)
71+
72+
# Структурные (комбинационные) фильтры
73+
74+
## `SerialFilter`
75+
- Последовательное включение двух произвольных `Filter` (не только IIR). Передача выхода первого на вход второго.
76+
77+
## `ParallelFilter`
78+
- Параллельное включение: усреднённая сумма откликов двух фильтров (балансировка усиления).
79+
80+
Назначение структурных классов: формирование составных конфигураций (каскады и разветвления) без ручного перемножения коэффициентов, возможность комбинировать разнородные фильтры.
81+
82+
# Абстрактный базовый класс `Filter`
83+
84+
- Определяет базовый интерфейс: `Process`, `Reset`, `FrequencyResponse`
85+
- Строители типов: статические фабрики `LowPass`, `HighPass`, `BandPass`, `BandStop`, а также `Butterworth`, `Chebyshev`, `Elliptic` для удобного fluent‑конструирования
86+
- Перегруженные операторы:
87+
- `filter * signal` — фильтрация сигнала
88+
- `filter1 + filter2` — параллельное соединение (`ParallelFilter`)
89+
- `filter1 * filter2` — последовательное соединение (`SerialFilter`)
90+
91+
# Методы расширения
92+
93+
## `DigitalFilterExtension`
94+
- `GetImpulseResponse(...)`: генерация импульсной характеристики с ранним прекращением по затуханию
95+
- `GetTransientResponse(...)`: генерация переходной характеристики (единичный скачок)
96+
97+
# Выбор типа фильтра (кратко)
98+
- Нужна ровная passband и терпима широкая переходная: Баттерворт
99+
- Требуется более крутой спад и рябь в одной полосе допустима: Чебышев (выбор рода)
100+
- Минимальный порядок и узкая переходная критичны: Эллиптический
101+
- Простое сглаживание / резонанс / узкая notch без сложных требований: RC / RLC
102+
- Комбинирование характеристик (усиление селективности, формирование окон): используйте каскады (`SerialFilter`) или параллель (`ParallelFilter`)
103+
104+
# Сводный перечень классов
105+
- Базовые: `Filter`, `IIR`
106+
- Баттерворт: `ButterworthLowPass`, `ButterworthHighPass`, `ButterworthBandPass`, `ButterworthBandStop`
107+
- Чебышев: `ChebyshevLowPass`, `ChebyshevHighPass`, `ChebyshevBandPass`, `ChebyshevBandStop` (+ роды I / II / IICorrected)
108+
- Эллиптические: `EllipticLowPass`, `EllipticHighPass`, `EllipticBandPass`, `EllipticBandStop`
109+
- RC / RLC: `RCLowPass`, `RCExponentialLowPass`, `RLCBandPass`, `RLCBandStop`
110+
- Структурные: `SerialFilter`, `ParallelFilter`
111+
- Расширения: `DigitalFilterExtension`
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#if !NET8_0_OR_GREATER
2+
using System.Runtime.CompilerServices;
3+
4+
namespace MathCore.DSP.Infrastructure;
5+
6+
internal static class ArgumentNullExceptionEx
7+
{
8+
extension(ArgumentNullException)
9+
{
10+
public static void ThrowIfNull(object? argument, [CallerArgumentExpression("argument")] string? ParamName = null)
11+
{
12+
if (argument != null)
13+
return;
14+
ArgumentNullException.Throw(ParamName);
15+
}
16+
17+
[DoesNotReturn]
18+
public static void Throw(string ParamName) => throw new ArgumentNullException(ParamName);
19+
}
20+
}
21+
22+
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
23+
public sealed class DoesNotReturnAttribute : Attribute;
24+
25+
#endif

MathCore.DSP/MathCore.DSP.csproj

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,20 @@
99
</TargetFrameworks>
1010
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
1111
<LangVersion>preview</LangVersion>
12-
<Version>0.0.14.2</Version>
12+
<Version>0.0.15</Version>
1313
<ImplicitUsings>enable</ImplicitUsings>
1414
<PackageReleaseNotes>
15-
Обновление пакетов
15+
Миграция на .NET 10.0 и обновление зависимостей.
1616
</PackageReleaseNotes>
17+
<PackageReadmeFile>readme.md</PackageReadmeFile>
1718
</PropertyGroup>
1819

1920
<PropertyGroup>
2021
<Authors>Shmachilin P.A.</Authors>
2122
<Description>Библиотека алгоритмов цифровой обработки сигналов</Description>
2223
<PackageProjectUrl>https://github.com/Infarh/MathCore.DSP</PackageProjectUrl>
2324
<RepositoryUrl>https://github.com/Infarh/MathCore.DSP.git</RepositoryUrl>
25+
<RepositoryType>git</RepositoryType>
2426
<PackageTags>DSP;Signal processing</PackageTags>
2527
<Copyright>shmachilin@gmail.com</Copyright>
2628
<SignAssembly>true</SignAssembly>
@@ -59,4 +61,12 @@
5961
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.7.0" PrivateAssets="All" />
6062
</ItemGroup>
6163

64+
<ItemGroup>
65+
<Using Include="MathCore.DSP.Infrastructure" />
66+
</ItemGroup>
67+
68+
<ItemGroup>
69+
<None Include="readme.md" Pack="true" PackagePath="" />
70+
</ItemGroup>
71+
6272
</Project>

0 commit comments

Comments
 (0)