Skip to content

Commit 906ff13

Browse files
committed
Унификация проверок на null, рефакторинг AllPassFilter
Заменены явные проверки на null на ArgumentNullException.ThrowIfNull во всех основных методах (AnalogBasedFilter.cs, DigitalFilter.cs, DigitalFilterExtension.cs, FilterEx.Export.cs, FT.cs). Переписан конструктор AllPassFilter на record-like стиль (C# 12), добавлены XML-комментарии. В ValidateBitDepth использовано новое условие проверки диапазона. Удалён неиспользуемый using. Изменения повышают читаемость и современность кода.
1 parent c9faee4 commit 906ff13

8 files changed

Lines changed: 31 additions & 33 deletions

File tree

MathCore.DSP/Filters/AllPassFilter.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
namespace MathCore.DSP.Filters;
33

44
/// <summary>Всепропускающий фильтр</summary>
5+
/// <remarks>Инициализация нового экземпляра <see cref="AllPassFilter"/></remarks>
6+
/// <param name="k">Коэффициент передачи</param>
57
// http://www.dsplib.ru/content/allpass/allpass.html
6-
public class AllPassFilter : IIR
7-
{
8-
/// <summary>Инициализация нового экземпляра <see cref="AllPassFilter"/></summary>
9-
/// <param name="k">Коэффициент передачи</param>
10-
public AllPassFilter(double k) : base(B: [k, 1], A: [1, k]) { }
11-
}
8+
public class AllPassFilter(double k) : IIR(B: [k, 1], A: [1, k]);

MathCore.DSP/Filters/AnalogBasedFilter.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ public static (Complex[] Poles, Complex[] Zeros) ToBandPass(
4949
Complex[] Zeros,
5050
double fpl, double fph)
5151
{
52-
if (Poles is null) throw new ArgumentNullException(nameof(Poles));
53-
if (Zeros is null) throw new ArgumentNullException(nameof(Zeros));
52+
ArgumentNullException.ThrowIfNull(Poles);
53+
ArgumentNullException.ThrowIfNull(Zeros);
5454
if (Poles.Length == 0) throw new ArgumentException("Размер вектора полюсов должен быть больше 0", nameof(Poles));
5555
if (Zeros.Length > Poles.Length) throw new ArgumentException("Число нулей не должна быть больше числа полюсов", nameof(Zeros));
5656

@@ -96,8 +96,8 @@ public static (Complex[] Poles, Complex[] Zeros) ToBandStop(
9696
Complex[] Zeros,
9797
double fpl, double fph)
9898
{
99-
if (Poles is null) throw new ArgumentNullException(nameof(Poles));
100-
if (Zeros is null) throw new ArgumentNullException(nameof(Zeros));
99+
ArgumentNullException.ThrowIfNull(Poles);
100+
ArgumentNullException.ThrowIfNull(Zeros);
101101
var count_p = Poles.Length;
102102
var count_0 = Zeros.Length;
103103
if (count_p == 0) throw new ArgumentException("Размер вектора полюсов должен быть больше 0", nameof(Poles));

MathCore.DSP/Filters/DigitalFilter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public static IEnumerable<Complex> ToZ(IEnumerable<Complex> p, double W0, double
106106
/// <returns>Нормирующий множитель</returns>
107107
public static double GetNormalizeCoefficient(IEnumerable<Complex> poles, double dt)
108108
{
109-
if (poles is null) throw new ArgumentNullException(nameof(poles));
109+
ArgumentNullException.ThrowIfNull(poles);
110110

111111
var k = 2 / dt;
112112
var (re, im) = poles.Multiply(p => k - p);

MathCore.DSP/Filters/DigitalFilterExtension.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public static class DigitalFilterExtension
1111
/// <exception cref="ArgumentOutOfRangeException">Если указанная точность меньше, либо равна 0</exception>
1212
public static IEnumerable<double> GetImpulseResponse(this DigitalFilter filter, int MaxSamples = -1, double Accuracy = 0.001)
1313
{
14-
if (filter is null) throw new ArgumentNullException(nameof(filter));
14+
ArgumentNullException.ThrowIfNull(filter);
1515
if (Accuracy <= 0) throw new ArgumentOutOfRangeException(nameof(Accuracy), "Точность должна быть больше 0");
1616
if (MaxSamples == 0) yield break;
1717

@@ -37,7 +37,7 @@ public static IEnumerable<double> GetImpulseResponse(this DigitalFilter filter,
3737
/// <returns>Последовательность отсчётов импульсной характеристики</returns>
3838
public static IEnumerable<double> GetTransientResponse(this DigitalFilter filter, int MaxSamples = -1/*, double Accuracy = 0.001*/)
3939
{
40-
if (filter is null) throw new ArgumentNullException(nameof(filter));
40+
ArgumentNullException.ThrowIfNull(filter);
4141
//if (Accuracy <= 0) throw new ArgumentOutOfRangeException(nameof(Accuracy), "Точность должна быть больше 0");
4242
if (MaxSamples == 0) yield break;
4343

MathCore.DSP/Filters/FilterEx.Export.cs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using static MathCore.Polynom.Array;
2-
3-
namespace MathCore.DSP.Filters;
1+
namespace MathCore.DSP.Filters;
42

53
public static partial class FilterEx
64
{
@@ -117,7 +115,7 @@ public FixedPointIirSosCoefficients(FixedPointSosSection[] Sections, int BitDept
117115
/// <exception cref="NotSupportedException">Если фильтр не является <see cref="IIR"/></exception>
118116
public static FixedPointIirCoefficients ExportToFixedPoint(this Filter Filter, int BitDepth = 16, int? FractionalBits = null)
119117
{
120-
if (Filter is null) throw new ArgumentNullException(nameof(Filter));
118+
ArgumentNullException.ThrowIfNull(Filter);
121119

122120
return Filter is IIR iir
123121
? iir.ExportToFixedPoint(BitDepth, FractionalBits)
@@ -132,7 +130,7 @@ public static FixedPointIirCoefficients ExportToFixedPoint(this Filter Filter, i
132130
/// <exception cref="ArgumentNullException">Если <paramref name="Filter"/> равен <see langword="null"/></exception>
133131
public static FixedPointIirCoefficients ExportToFixedPoint(this IIR Filter, int BitDepth = 16, int? FractionalBits = null)
134132
{
135-
if (Filter is null) throw new ArgumentNullException(nameof(Filter));
133+
ArgumentNullException.ThrowIfNull(Filter);
136134

137135
ValidateBitDepth(BitDepth);
138136

@@ -157,7 +155,7 @@ public static FixedPointIirCoefficients ExportToFixedPoint(this IIR Filter, int
157155
/// <exception cref="NotSupportedException">Если фильтр не является <see cref="IIR"/></exception>
158156
public static FixedPointIirSosCoefficients ExportToFixedPointSos(this Filter Filter, int BitDepth = 16, int? FractionalBits = null)
159157
{
160-
if (Filter is null) throw new ArgumentNullException(nameof(Filter));
158+
ArgumentNullException.ThrowIfNull(Filter);
161159

162160
return Filter is IIR iir
163161
? iir.ExportToFixedPointSos(BitDepth, FractionalBits)
@@ -173,7 +171,7 @@ public static FixedPointIirSosCoefficients ExportToFixedPointSos(this Filter Fil
173171
/// <exception cref="InvalidOperationException">Если не удалось выполнить секционное разложение фильтра</exception>
174172
public static FixedPointIirSosCoefficients ExportToFixedPointSos(this IIR Filter, int BitDepth = 16, int? FractionalBits = null)
175173
{
176-
if (Filter is null) throw new ArgumentNullException(nameof(Filter));
174+
ArgumentNullException.ThrowIfNull(Filter);
177175

178176
ValidateBitDepth(BitDepth);
179177

@@ -222,8 +220,8 @@ public double PoleRadius
222220

223221
private static (double[] B, double[] A) Normalize(IReadOnlyList<double> B, IReadOnlyList<double> A)
224222
{
225-
if (B is null) throw new ArgumentNullException(nameof(B));
226-
if (A is null) throw new ArgumentNullException(nameof(A));
223+
ArgumentNullException.ThrowIfNull(B);
224+
ArgumentNullException.ThrowIfNull(A);
227225
if (B.Count == 0) throw new ArgumentException("Размер массива коэффициентов числителя должен быть больше 0", nameof(B));
228226
if (A.Count < 2) throw new ArgumentException("Размер массива коэффициентов знаменателя должен быть больше 1", nameof(A));
229227

@@ -242,8 +240,8 @@ private static (double[] B, double[] A) Normalize(IReadOnlyList<double> B, IRead
242240

243241
private static void EnsureFinite(IEnumerable<double> Values, string ParamName)
244242
{
245-
if (Values is null) throw new ArgumentNullException(nameof(Values));
246-
if (ParamName is null) throw new ArgumentNullException(nameof(ParamName));
243+
ArgumentNullException.ThrowIfNull(Values);
244+
ArgumentNullException.ThrowIfNull(ParamName);
247245

248246
foreach (var value in Values)
249247
if (!IsFinite(value))
@@ -254,13 +252,13 @@ private static void EnsureFinite(IEnumerable<double> Values, string ParamName)
254252

255253
private static void ValidateBitDepth(int BitDepth)
256254
{
257-
if (BitDepth < 2 || BitDepth > 62)
255+
if (BitDepth is < 2 or > 62)
258256
throw new ArgumentOutOfRangeException(nameof(BitDepth), BitDepth, "Разрядность коэффициентов должна находиться в диапазоне от 2 до 62 бит");
259257
}
260258

261259
private static int ResolveFractionalBits(IReadOnlyList<double> Coefficients, int BitDepth, int? FractionalBits)
262260
{
263-
if (Coefficients is null) throw new ArgumentNullException(nameof(Coefficients));
261+
ArgumentNullException.ThrowIfNull(Coefficients);
264262

265263
if (FractionalBits is { } explicit_fractional_bits)
266264
{
@@ -399,7 +397,7 @@ private static SosSection[] BuildSos(double[] A, double[] B)
399397

400398
private static Complex[] GetRoots(double[] Coefficients)
401399
{
402-
if (Coefficients is null) throw new ArgumentNullException(nameof(Coefficients));
400+
ArgumentNullException.ThrowIfNull(Coefficients);
403401

404402
var n = Coefficients.Length - 1;
405403
while (n > 0 && Math.Abs(Coefficients[n]) < 1e-18)
@@ -528,7 +526,7 @@ private static double[][] BuildSectionsFromRoots(Complex[] Roots)
528526

529527
private static void DistributeGain(SosSection[] Sections, ref double Gain)
530528
{
531-
if (Sections is null) throw new ArgumentNullException(nameof(Sections));
529+
ArgumentNullException.ThrowIfNull(Sections);
532530
if (Sections.Length == 0 || Gain == 0 || double.IsNaN(Gain) || double.IsInfinity(Gain))
533531
return;
534532

MathCore.DSP/Fourier/FT.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static Complex[] GetFourierTransform(this IEnumerable<double> Values, boo
5353
/// <param name="IsInverse">Обратное преобразование</param>
5454
public static Complex[] GetFourierTransform(this double[] Values, bool IsInverse = false)
5555
{
56-
if (Values is null) throw new ArgumentNullException(nameof(Values));
56+
ArgumentNullException.ThrowIfNull(Values);
5757

5858
var N = Values.Length;
5959
var spectrum = new Complex[N];
@@ -82,7 +82,7 @@ public static Complex[] GetFourierTransform(this double[] Values, bool IsInverse
8282
/// <param name="progress">Метод информирования о прогрессе операции</param>
8383
public static Complex[] GetFourierTransform(this double[] Values, bool IsInverse, Action<double>? progress)
8484
{
85-
if (Values is null) throw new ArgumentNullException(nameof(Values));
85+
ArgumentNullException.ThrowIfNull(Values);
8686

8787
var N = Values.Length;
8888
var spectrum = new Complex[N];
@@ -112,7 +112,7 @@ public static Complex[] GetFourierTransform(this double[] Values, bool IsInverse
112112
/// <param name="Inverse">Обратное преобразование</param>
113113
public static Complex[] GetFourierTransform(this Complex[] Values, bool Inverse = false)
114114
{
115-
if (Values is null) throw new ArgumentNullException(nameof(Values));
115+
ArgumentNullException.ThrowIfNull(Values);
116116

117117
var spectrum = new Complex[Values.Length];
118118
var N = spectrum.Length;
@@ -140,7 +140,7 @@ public static Complex[] GetFourierTransform(this Complex[] Values, bool Inverse
140140
/// <param name="progress">Метод индикации прогресса выполнения</param>
141141
public static Complex[] GetFourierTransform(this Complex[] Values, bool Inverse, Action<double>? progress)
142142
{
143-
if (Values is null) throw new ArgumentNullException(nameof(Values));
143+
ArgumentNullException.ThrowIfNull(Values);
144144

145145
var spectrum = new Complex[Values.Length];
146146
var N = spectrum.Length;

MathCore.DSP/Infrastructure/Extensions/ArgumentNullExceptionEx.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#if NETSTANDARD2_0
22
using System.Runtime.CompilerServices;
33

4-
namespace MathCore.DSP.Infrastructure;
4+
namespace MathCore.DSP.Infrastructure.Extensions;
55

66
internal static class ArgumentNullExceptionEx
77
{

MathCore.DSP/MathCore.DSP.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262

6363
<ItemGroup>
6464
<Using Include="MathCore.DSP.Infrastructure" />
65+
</ItemGroup>
66+
67+
<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
6568
<Using Include="MathCore.DSP.Infrastructure.Extensions" />
6669
</ItemGroup>
6770

0 commit comments

Comments
 (0)