add lab6-filters

This commit is contained in:
Klagarge authored and Rémi Heredero committed 2024-02-03 23:35:38 +01:00
1 parent 4d5693aa1d
commit aa399dcc93
6 files changed
+251 -193

No files matched your search

+1
View File
@@ -161,6 +161,7 @@
<!-- Code highlights -->
<script src="//cdn.jsdelivr.net/npm/prismjs@1/components/prism-armasm.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1/components/prism-matlab.js"></script>
<!-- Dark Theme -->
<script src="//cdn.jsdelivr.net/npm/docsify-darklight-theme@latest/dist/index.min.js"> </script>
+91 -50
View File
@@ -17,6 +17,7 @@ In according to the sample theory, we have to choose at least 2 times the maximu
In this case, the maximum frequency is 1 kHz, so we have to choose a sample frequency at least at 2 kHz.
We take 10 time $f_c$ for the sample frequency, so we choose 20 kHz.
## Transfer function
For calculate the transfer function, we have to calculate the poles and zeros of the filter.
@@ -29,64 +30,104 @@ Be careful, $k_a$ is not the DC gain.
For a low pass filter without zeros, the "digital" gain is :
$$k_{d} = k_{a}\cdot \prod_{i} \frac{1-e^{P_{ai}\cdot T}}{P_{ai}}$$
----------
We can apply the bilinear transformation to the poles and zeros of the analog filter to obtain the poles and zeros of the digital filter.
$$
p_{di} = \frac{1+p_{ai}\cdot \frac{T}{2}}{1-p_{ai}\cdot \frac{T}{2}}
\qquad \qquad
z_{di} = \frac{1+z_{ai}\cdot \frac{T}{2}}{1-z_{ai}\cdot \frac{T}{2}}
$$
And for the low pass filter, the "bilinear" gain is :
$$k_{d} = k_{a}\cdot \frac{1}{\prod_{i}\left( \frac{2}{T}-p_{ai} \right)}$$
fc = 1000;
wc = 2*pi*fc;
fs = 10*fc;
ts = 1/fs;
num = [0 0 1];
den = [1/(wc*wc) 1.414/wc 1];
sysa = tf(num, den)
[za,pa,ka] = tf2zp(num, den);
%fvtool(num,den,'polezero')
kd = ka .* ((1-exp(pa(1).*ts))./pa(1)) .* ((1-exp(pa(2).*ts))./pa(2));
kd = real(kd);
pd = (1+pa.*(ts./2)) ./ (1-pa.*(ts./2));
zd = (1+za.*(ts/2)) ./ (1-za.*(ts/2));
sysd = zpk(zd, pd, kd, ts)
[zdb, pdb, kdb] = bilinear(za, pa, ka, fs);
sysdb = zpk(zdb, pdb, kdb, ts)
bode(sysa, sysd, sysdb);
On the following diagram, we can see the bode diagram of the analog, digital filter and the filter with the bilinear transformation.
![bode_design_filter.svg](bode_design_filter.svg)
-----------
clear;
close all;
clc;
# IIR filter design
H0 = 0; % dB
H1 = -3; % dB
H2 = -40; % dB
fn.p = 7000; % Hz
fn.s = 9000 % Hz
fs = 48000; % Hz
We must design an IIR filter with the following specifications :
fa.p = (fs/pi) * tan((pi*fn.p)/fs);
fa.s = (fs/pi) * tan((pi*fn.s)/fs)
- $H_0 = 0 [dB]$
- $H_1 = -3 [dB]$
- $H_2 = -40 [dB]$
- $f_{pass} = 7 [kHz]$
- $f_{stop} = 9 [kHz]$
- $f_s = 48 [kHz]$
wp = 2*pi*fa.p;
ws = 2*pi*fa.s;
ts = 1/fs;
[n, wp] = ellipord(wp, ws, 3, 40, 's')
[z, p, k] = ellip(n, 3, 40, wp, 's');
sys = zpk(z, p, k);
[zd, pd, kd] = bilinear(z, p, k, fs);
sysd = zpk(zd, pd, kd, ts)
bode(sys, sysd)
title('Bode Diagram', 'Color', '#808080');
xlabel('Frequency (rad/s)', 'Color', '#808080');
ylabel('Magnitude (dB)', 'Color', '#808080');
ylabel('Phase (deg)', 'Color', '#808080');
legend('digital','bilinear', 'Color', 'white')
sos = zp2sos(z,p,k);
We first calculate the analog filter for search the order with the function *ellipord*.
Then, we calculate the poles and zeros with the function *ellip*.
We apply the bilinear transformation to the poles and zeros to obtain the poles and zeros of the digital filter.
Finally, we can plot the bode diagram of the digital filter and the filter with the bilinear transformation.
![iir_filter.svg](iir_filter.svg)
# DSP implementation
We will implement the previously designed digital filter using a C program that will run in real-time on a fixed-point DSP.
We will employ a cascade structure, consisting of 2 second-order stages.
We will use the TMS320C6211 DSK from Texas Instruments.
The following equation represent an universal transfer function of a second-order filter :
$$H(z) = \frac{b_{0}+b_{1}\cdot z^{-1}+b_{2}\cdot z^{-2}}{a_{0}+a_{1}\cdot z^{-1}+a_{2}\cdot z^{-2}}$$
The following figure depicts the block diagram of this implementation in the case where a0 = 1
This structure is commonly referred to as "Direct Form I." It requires the storage of past values of both the input and output.
![direct_form_1.png](direct_form_1.svg)
So we have the difference equation :
$$y(n) = b_{0}\cdot x(n)+b_{1}\cdot x(n-1)+b_{2}\cdot x(n-2)-a_{1}\cdot y(n-1)-a_{2}\cdot y(n-2)$$
It exists a second structure called "Direct Form II" which is more efficient in terms of computation and memory usage.
![direct_form_2.png](direct_form_2.svg)
The difference equation is :
$$\begin{align}
y(n) &= tmp\cdot b_{0}+w[0]\cdot b_{1}+w[1]\cdot b_{2} \\
\\
tmp &= x(n)-a_{1}\cdot w[0]-a_{2}\cdot w[1] \\
\\
w[0] &= tmp_{prev} \\
\\
w[1] &= w[0]_{prev}
\end{align}$$
The variables can be translated into code by shifting the coefficients 14 positions to the left to enhance precision
after the decimal point, as the DSP only works with integers.
Structures for the coefficients and the state variables are defined as follows :
```c
typedef struct {
short b0;
short b1;
short b2;
short a0;
short a1;
short a2;
} coeff_sec_order;
short w3[2];
short w4[2];
coeff_sec_order stage1 = { 469, 349, 469, 16384, -23699, 10692};
coeff_sec_order stage2 = {16384, -11187, 16384, 16384, -19657, 14890};
```
The following code is the implementation of the Direct Form II function :
```c
void iir_sec_order_dir_s(coeff_sec_order Coeff, short*w, short* Input, short* Output) {
register short tmp;
tmp = (long)* Input - (( (Long)Coeff.a1 * (long)w[0]) >> SHIFT) - (( (long)Coeff.a2 * (long)w[1]) >> SHIFT);
*Output = (( (long)Coeff.b0 * (long)tmp >> SHIFT) + (( (long)Coeff.b1 * (long)w[0]) >> SHIFT) + (( (long)Coeff.b2 * (long)w[1]) >> SHIFT);
w[1] = w[0];
w[0] = tmp;
}
```
For a better effect of the filter, the function can be called several times.
@@ -21,9 +21,9 @@
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.66684046"
inkscape:cx="717.56294"
inkscape:cy="398.14621"
inkscape:zoom="0.94305482"
inkscape:cx="1042.3572"
inkscape:cy="236.99577"
inkscape:window-width="1918"
inkscape:window-height="1008"
inkscape:window-x="953"
@@ -2037,86 +2037,90 @@
id="path643" />
</g>
<g
style="color-interpolation:sRGB;fill:#ffffff;stroke:#ffffff;color-rendering:optimizeSpeed;image-rendering:optimizeSpeed;shape-rendering:crispEdges;text-rendering:optimizeSpeed"
id="g649"
transform="translate(-238.52001,-80.103308)">
<path
style="stroke:none"
d="m 1725,582 v -53 h -90 v 53 z"
id="path647" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,458.89669)"
id="g653">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text651">analog</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#0072bd;stroke:#0072bd;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g657"
transform="translate(-238.52001,-80.103308)">
<line
y2="539"
style="fill:none"
x1="1639"
x2="1679"
y1="539"
id="line655" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,475.39669)"
id="g661">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text659">digital</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#d95319;stroke:#d95319;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g665"
transform="translate(-238.52001,-80.103308)">
<line
y2="555.5"
style="fill:none"
x1="1639"
x2="1679"
y1="555.5"
id="line663" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,491.89669)"
id="g669">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text667">bilinear</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#edb120;stroke:#edb120;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g675"
transform="translate(-238.52001,-80.103308)">
<line
y2="572"
style="fill:none"
x1="1639"
x2="1679"
y1="572"
id="line671" />
<path
d="m 1635,582 v -53 h 90 v 53 z"
style="fill:none;fill-rule:evenodd;stroke:#262626;stroke-linejoin:miter"
id="path673" />
id="g644"
transform="translate(-23.865014,-350.98702)">
<g
style="color-interpolation:sRGB;fill:#cccccc;stroke:#ffffff;color-rendering:optimizeSpeed;image-rendering:optimizeSpeed;shape-rendering:crispEdges;text-rendering:optimizeSpeed"
id="g649"
transform="translate(-238.52001,-80.103308)">
<path
style="fill:#cccccc;stroke:none"
d="m 1725,582 v -53 h -90 v 53 z"
id="path647" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,458.89669)"
id="g653">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text651">analog</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#0072bd;stroke:#0072bd;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g657"
transform="translate(-238.52001,-80.103308)">
<line
y2="539"
style="fill:none"
x1="1639"
x2="1679"
y1="539"
id="line655" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,475.39669)"
id="g661">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text659">digital</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#d95319;stroke:#d95319;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g665"
transform="translate(-238.52001,-80.103308)">
<line
y2="555.5"
style="fill:none"
x1="1639"
x2="1679"
y1="555.5"
id="line663" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,491.89669)"
id="g669">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text667">bilinear</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#edb120;stroke:#edb120;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g675"
transform="translate(-238.52001,-80.103308)">
<line
y2="572"
style="fill:none"
x1="1639"
x2="1679"
y1="572"
id="line671" />
<path
d="m 1635,582 v -53 h 90 v 53 z"
style="fill:none;fill-rule:evenodd;stroke:#262626;stroke-linejoin:miter"
id="path673" />
</g>
</g>
<g
transform="translate(807.48099,15.146692)"

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="840px" height="286px" viewBox="-0.5 -0.5 840 286" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2024-02-03T22:03:26.442Z&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0&quot; etag=&quot;Da41eLOf3AT8AQXfy7Nj&quot; version=&quot;22.1.22&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;CkdF-7UHB_tb0CRjxC_V&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><style type="text/css">@import url(https://fonts.googleapis.com/css2?family=Architects+Daughter:wght@400;500);&#xa;</style><style xmlns="http://www.w3.org/1999/xhtml" id="MJX-SVG-styles">&#xa;mjx-container[jax="SVG"] {&#xa; direction: ltr;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"] &gt; svg {&#xa; overflow: visible;&#xa; min-height: 1px;&#xa; min-width: 1px;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"] &gt; svg a {&#xa; fill: blue;&#xa; stroke: blue;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][display="true"] {&#xa; display: block;&#xa; text-align: center;&#xa; margin: 1em 0;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][display="true"][width="full"] {&#xa; display: flex;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][justify="left"] {&#xa; text-align: left;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][justify="right"] {&#xa; text-align: right;&#xa;}&#xa;&#xa;g[data-mml-node="merror"] &gt; g {&#xa; fill: red;&#xa; stroke: red;&#xa;}&#xa;&#xa;g[data-mml-node="merror"] &gt; rect[data-background] {&#xa; fill: yellow;&#xa; stroke: none;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; line[data-line], svg[data-table] &gt; g &gt; line[data-line] {&#xa; stroke-width: 70px;&#xa; fill: none;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; rect[data-frame], svg[data-table] &gt; g &gt; rect[data-frame] {&#xa; stroke-width: 70px;&#xa; fill: none;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; .mjx-dashed, svg[data-table] &gt; g &gt; .mjx-dashed {&#xa; stroke-dasharray: 140;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; .mjx-dotted, svg[data-table] &gt; g &gt; .mjx-dotted {&#xa; stroke-linecap: round;&#xa; stroke-dasharray: 0,140;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; g &gt; svg {&#xa; overflow: visible;&#xa;}&#xa;&#xa;[jax="SVG"] mjx-tool {&#xa; display: inline-block;&#xa; position: relative;&#xa; width: 0;&#xa; height: 0;&#xa;}&#xa;&#xa;[jax="SVG"] mjx-tool &gt; mjx-tip {&#xa; position: absolute;&#xa; top: 0;&#xa; left: 0;&#xa;}&#xa;&#xa;mjx-tool &gt; mjx-tip {&#xa; display: inline-block;&#xa; padding: .2em;&#xa; border: 1px solid #888;&#xa; font-size: 70%;&#xa; background-color: #F8F8F8;&#xa; color: black;&#xa; box-shadow: 2px 2px 5px #AAAAAA;&#xa;}&#xa;&#xa;g[data-mml-node="maction"][data-toggle] {&#xa; cursor: pLine truncated

After

Width:  |  Height:  |  Size: 82 KiB

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="520px" height="366px" viewBox="-0.5 -0.5 520 366" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2024-02-03T22:16:47.416Z&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0&quot; etag=&quot;gL6vpL3MQfkpyT-y1ADy&quot; version=&quot;22.1.22&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;CkdF-7UHB_tb0CRjxC_V&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><style type="text/css">@import url(https://fonts.googleapis.com/css2?family=Architects+Daughter:wght@400;500);&#xa;</style><style xmlns="http://www.w3.org/1999/xhtml" id="MJX-SVG-styles">&#xa;mjx-container[jax="SVG"] {&#xa; direction: ltr;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"] &gt; svg {&#xa; overflow: visible;&#xa; min-height: 1px;&#xa; min-width: 1px;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"] &gt; svg a {&#xa; fill: blue;&#xa; stroke: blue;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][display="true"] {&#xa; display: block;&#xa; text-align: center;&#xa; margin: 1em 0;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][display="true"][width="full"] {&#xa; display: flex;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][justify="left"] {&#xa; text-align: left;&#xa;}&#xa;&#xa;mjx-container[jax="SVG"][justify="right"] {&#xa; text-align: right;&#xa;}&#xa;&#xa;g[data-mml-node="merror"] &gt; g {&#xa; fill: red;&#xa; stroke: red;&#xa;}&#xa;&#xa;g[data-mml-node="merror"] &gt; rect[data-background] {&#xa; fill: yellow;&#xa; stroke: none;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; line[data-line], svg[data-table] &gt; g &gt; line[data-line] {&#xa; stroke-width: 70px;&#xa; fill: none;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; rect[data-frame], svg[data-table] &gt; g &gt; rect[data-frame] {&#xa; stroke-width: 70px;&#xa; fill: none;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; .mjx-dashed, svg[data-table] &gt; g &gt; .mjx-dashed {&#xa; stroke-dasharray: 140;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; .mjx-dotted, svg[data-table] &gt; g &gt; .mjx-dotted {&#xa; stroke-linecap: round;&#xa; stroke-dasharray: 0,140;&#xa;}&#xa;&#xa;g[data-mml-node="mtable"] &gt; g &gt; svg {&#xa; overflow: visible;&#xa;}&#xa;&#xa;[jax="SVG"] mjx-tool {&#xa; display: inline-block;&#xa; position: relative;&#xa; width: 0;&#xa; height: 0;&#xa;}&#xa;&#xa;[jax="SVG"] mjx-tool &gt; mjx-tip {&#xa; position: absolute;&#xa; top: 0;&#xa; left: 0;&#xa;}&#xa;&#xa;mjx-tool &gt; mjx-tip {&#xa; display: inline-block;&#xa; padding: .2em;&#xa; border: 1px solid #888;&#xa; font-size: 70%;&#xa; background-color: #F8F8F8;&#xa; color: black;&#xa; box-shadow: 2px 2px 5px #AAAAAA;&#xa;}&#xa;&#xa;g[data-mml-node="maction"][data-toggle] {&#xa; cursor: pLine truncated

After

Width:  |  Height:  |  Size: 79 KiB

+64 -60
View File
@@ -21,9 +21,9 @@
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.66684046"
inkscape:cx="477.62549"
inkscape:cy="398.14621"
inkscape:zoom="1.3336809"
inkscape:cx="1340.6505"
inkscape:cy="283.80102"
inkscape:window-width="1918"
inkscape:window-height="1008"
inkscape:window-x="953"
@@ -1764,63 +1764,67 @@
id="path2559" />
</g>
<g
style="color-interpolation:sRGB;fill:#ffffff;stroke:#ffffff;color-rendering:optimizeSpeed;image-rendering:optimizeSpeed;shape-rendering:crispEdges;text-rendering:optimizeSpeed"
id="g2565"
transform="translate(-238.52001,-80.103308)">
<path
style="stroke:none"
d="m 1725,565 v -36 h -90 v 36 z"
id="path2563" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,458.75969)"
id="g2569">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text2567">digital</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#0072bd;stroke:#0072bd;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g2573"
transform="translate(-238.52001,-80.103308)">
<line
y2="538.86298"
style="fill:none"
x1="1639"
x2="1679"
y1="538.86298"
id="line2571" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,475.03369)"
id="g2577">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text2575">bilinear</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#d95319;stroke:#d95319;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g2583"
transform="translate(-238.52001,-80.103308)">
<line
y2="555.13702"
style="fill:none"
x1="1639"
x2="1679"
y1="555.13702"
id="line2579" />
<path
d="m 1635,565 v -36 h 90 v 36 z"
style="fill:none;fill-rule:evenodd;stroke:#262626;stroke-linejoin:miter"
id="path2581" />
id="g1415"
transform="translate(-5.2643303,-359.90618)">
<g
style="color-interpolation:sRGB;fill:#cccccc;stroke:#ffffff;color-rendering:optimizeSpeed;image-rendering:optimizeSpeed;shape-rendering:crispEdges;text-rendering:optimizeSpeed"
id="g2565"
transform="translate(-238.52001,-80.103308)">
<path
style="fill:#cccccc;stroke:none"
d="m 1725,565 v -36 h -90 v 36 z"
id="path2563" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,458.75969)"
id="g2569">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text2567">digital</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#0072bd;stroke:#0072bd;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g2573"
transform="translate(-238.52001,-80.103308)">
<line
y2="538.86298"
style="fill:none"
x1="1639"
x2="1679"
y1="538.86298"
id="line2571" />
</g>
<g
style="color-interpolation:linearRGB;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
transform="translate(1443.48,475.03369)"
id="g2577">
<text
x="0"
xml:space="preserve"
y="5"
style="stroke:none"
id="text2575">bilinear</text>
</g>
<g
style="color-interpolation:linearRGB;fill:#d95319;stroke:#d95319;stroke-width:0.6667;stroke-linecap:butt;stroke-linejoin:round;color-rendering:optimizeQuality;image-rendering:optimizeQuality;text-rendering:geometricPrecision"
id="g2583"
transform="translate(-238.52001,-80.103308)">
<line
y2="555.13702"
style="fill:none"
x1="1639"
x2="1679"
y1="555.13702"
id="line2579" />
<path
d="m 1635,565 v -36 h 90 v 36 z"
style="fill:none;fill-rule:evenodd;stroke:#262626;stroke-linejoin:miter"
id="path2581" />
</g>
</g>
<g
transform="translate(807.48099,15.146692)"

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB