Krotos Modules 3
Loading...
Searching...
No Matches
AirAbsorptionFilter.cpp
Go to the documentation of this file.
1namespace krotos
2{
11
12 void AirAbsorptionFilter::prepare(double sampleRate, int samplesPerBlock)
13 {
14 ignoreUnused(sampleRate);
15 ignoreUnused(samplesPerBlock);
16
17 for (int j = 0; j < 2; j++)
18 {
19 m_filter1[j].reset();
20 m_filter2[j].reset();
21 }
22 }
23
24 float AirAbsorptionFilter::process(float inputSample, int numChannel)
25 {
26 inputSample = inputSample * m_gain;
27 inputSample = m_filter1[numChannel](inputSample);
28 inputSample = m_filter2[numChannel](inputSample);
29
30 return inputSample;
31 }
32
34 {
35 m_gain = 10.0f / std::max(distance, 10.0f); // inverse square law
36
37 auto index = jmap<float>(distance, 1.0f, 70.0f, 0.0f, 6.0f);
38 auto mu = index - std::floor(index);
39 auto b1 = linear_interpolate(m_b1[std::size_t(index)], m_b1[std::size_t(index) + 1], mu);
40 auto b2 = linear_interpolate(m_b2[std::size_t(index)], m_b2[std::size_t(index) + 1], mu);
41
42 m_filter1[0].b = b1;
43 m_filter1[1].b = b1;
44
45 m_filter2[0].b = b2;
46 m_filter2[1].b = b2;
47 }
48
49 void AirAbsorptionFilter::test_impulse_response(std::size_t index, String outfile)
50 {
51 jassert(index < 7);
52
53 // Figure 4 (Petruzzellis & Zanghieri 2013)
54 // Temperature 0°C, relative humidity 10%
55 const float a1 = 0.0503f;
56 const float a2 = 0.849f;
57 const std::array<float, 7> b1Array{0.0168f, 0.034f, 0.052f, 0.069f, 0.085f, 0.102f, 0.1182f};
58 const std::array<float, 7> b2Array{0.02f, 0.02f, 0.06f, 0.08f, 0.1f, 0.12f, 0.14f};
59 auto b1 = b1Array[index];
60 auto b2 = b2Array[index];
61
62 m_filter1[0].reset();
63 m_filter2[0].reset();
64 m_filter1[0].config(a1, b1);
65 m_filter2[0].config(a2, b2);
66
67 const int N = 1024;
68 std::vector<float> y(N);
69 for (int i = 0; i < N; ++i)
70 {
71 // Dirac
72 auto x = (i == 0) ? 1.0f : 0.0f;
73 x = m_filter1[0](x);
74 x = m_filter2[0](x);
75 y[i] = x;
76 }
77 std::ofstream outputFile(outfile.toStdString());
78 if (!outputFile.is_open())
79 {
80 DBG("Failed to open file: ");
81 return;
82 }
83 for (const auto& value : y)
84 {
85 outputFile << value << " ";
86 }
87 outputFile << '\n';
88 outputFile.close();
89
90 m_filter1[0].reset();
91 m_filter2[0].reset();
92 }
93
94 AirAbsorptionFilter::modified_lowpass::modified_lowpass(float a, float b) : a(a), b(b), x1(0), y1(0) {}
95
97 {
98 // compute result
99 auto r = (a + b - 1.0f) * s + (1.0f - b) * x1 + (1.0f - a) * y1;
100
101 // shift s to x1
102 x1 = s;
103
104 // shift r to y1
105 y1 = r;
106
107 return r;
108 }
109
111 {
112 a = a_;
113 b = b_;
114 }
115
117 {
118 x1 = 0.0f;
119 y1 = 0.0f;
120 }
121
122} // namespace krotos
std::array< float, 8 > m_b1
Definition AirAbsorptionFilter.h:25
void test_impulse_response(std::size_t index, String outfile)
Definition AirAbsorptionFilter.cpp:49
AirAbsorptionFilter()
Definition AirAbsorptionFilter.cpp:3
float m_gain
Definition AirAbsorptionFilter.h:19
float m_a2
Definition AirAbsorptionFilter.h:24
float process(float inputSample, int numChannel)
Definition AirAbsorptionFilter.cpp:24
void setDistance(float distance)
Definition AirAbsorptionFilter.cpp:33
float m_a1
Definition AirAbsorptionFilter.h:23
void prepare(double sampleRate, int samplesPerBlock)
Definition AirAbsorptionFilter.cpp:12
modified_lowpass m_filter2[2]
Definition AirAbsorptionFilter.h:47
constexpr float linear_interpolate(float y1, float y2, float mu)
Definition AirAbsorptionFilter.h:17
std::array< float, 8 > m_b2
Definition AirAbsorptionFilter.h:26
modified_lowpass m_filter1[2]
Definition AirAbsorptionFilter.h:46
Definition AirAbsorptionFilter.cpp:2
float operator()(float s)
Definition AirAbsorptionFilter.cpp:96
void config(float a_, float b_)
Definition AirAbsorptionFilter.cpp:110
float a
Definition AirAbsorptionFilter.h:39
modified_lowpass(float a=0.0f, float b=0.0f)
Definition AirAbsorptionFilter.cpp:94
float b
Definition AirAbsorptionFilter.h:39
void reset()
Definition AirAbsorptionFilter.cpp:116