This repository has been archived by the owner on Feb 13, 2022. It is now read-only.
/
ImpulseResponse.cs
101 lines (82 loc) · 3.68 KB
/
ImpulseResponse.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* SoundUtils
LICENSE - The MIT License (MIT)
Copyright (c) 2017 Tomona Nanase
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
namespace SoundUtils.Filtering
{
/// <summary>
/// インパルスに対する応答を生成する抽象クラスを定義します。
/// </summary>
public abstract class ImpulseResponse
{
#region -- Public Properties --
/// <summary>
/// サンプリング周波数。
/// </summary>
public double SamplingRate { get; set; }
#endregion
#region -- Public Methods --
/// <summary>
/// 指定された長さの配列からインパルス応答を生成します。
/// </summary>
/// <param name="length">インパルス応答の長さ。</param>
/// <returns>インパルス応答が格納された配列。</returns>
public double[] Generate(int length)
{
if (length < 0)
throw new ArgumentOutOfRangeException(nameof(length));
var array = new double[length];
GenerateValues(array, length);
return array;
}
/// <summary>
/// 指定された配列にインパルス応答を生成します。
/// </summary>
/// <param name="array">インパルス応答が生成される配列。</param>
public void Generate(double[] array)
{
if (array == null)
throw new ArgumentNullException(nameof(array));
var length = array.Length;
GenerateValues(array, length);
}
/// <summary>
/// 指定された配列にインパルス応答を生成します。
/// </summary>
/// <param name="array">インパルス応答が生成される配列。</param>
/// <param name="length">生成される長さ。</param>
public void Generate(double[] array, int length)
{
if (array == null)
throw new ArgumentNullException(nameof(array));
if (array.Length < 2 || length < 2 || array.Length < length)
throw new ArgumentOutOfRangeException(nameof(length));
var arrayLength = array.Length;
GenerateValues(array, Math.Min(arrayLength, length));
}
#endregion
#region -- Protected Methods --
/// <summary>
/// 指定された配列に size だけの長さでインパルス応答を生成します。
/// </summary>
/// <param name="array">インパルス応答が生成される配列。</param>
/// <param name="size">生成される長さ。</param>
protected abstract void GenerateValues(double[] array, int size);
#endregion
}
}