<phyphox xmlns="https://phyphox.org/xml" version="1.18">
  <title>Octave band SPL</title>
  <category>Acoustics</category>
  <description>Experiment shows the SPL in different octaves from, 31.5, 63, 125, 250, 500, 1k, 2k, 4k, 8k and 16k Hz centre frequency.
Note that this is not calibrated but only intended to show the principles of octave bands.
  </description>
  <data-containers>
    <container size="32768">recording</container>
    <container>rate</container>
    <container>rate/2</container>
    <container size="32768">appended_recording</container>
    <container size="32768">recording_subrange</container>
    <container>recording_length</container>
    <container init="8192">samples</container>
    <container>actual_samples/2</container>
    <container>actual_samples/2+1</container>
    <container>actual_samples+1</container>
    <container>actual_samples</container>
    <container>subrange_start</container>
    <container>period</container>
    <container>df</container>
    <container size="32768">time</container>
    <container size="32769">frequency</container>
    <container size="32768">fftX</container>
    <container size="32768">fftY</container>
    <container size="16384">halfFrequency</container>
    <container size="16384">halfFFTtempX</container>
    <container size="16384">halfFFTtempY</container>
    <container size="16384">fft</container>
    <container>f0</container>
    <container size="0">amplitude</container>
    <container size="0">t</container>
    <container>a</container>
    <container>tnow</container>
    <container>f1</container>
    <container>f2</container>
    <container size="16384">filteredFFT</container>
    <container size="2">f1x</container>
    <container size="2">f1y</container>
    <container size="2">f2x</container>
    <container size="2">f2y</container>
    <container size="0">asum</container>
    <container size="16384">FFT31,5</container>
    <container>a31,5</container>
    <container size="0">asum31,5</container>
    <container size="16384">FFT63</container>
    <container size="16384">FFT125</container>
    <container size="16384">FFT250</container>
    <container size="16384">FFT500</container>
    <container size="16384">FFT1K</container>
    <container size="16384">FFT2K</container>
    <container size="16384">FFT4K</container>
    <container size="16384">FFT8K</container>
    <container size="16384">FFT16K</container>
    <container>a63</container>
    <container>a125</container>
    <container>a250</container>
    <container>a500</container>
    <container>a1k</container>
    <container>a2k</container>
    <container>a4k</container>
    <container>a8k</container>
    <container>a16k</container>
    <container>asum63</container>
    <container>asum125</container>
    <container>asum250</container>
    <container>asum500</container>
    <container>asum1k</container>
    <container>asum2k</container>
    <container>asum4k</container>
    <container>asum8k</container>
    <container>asum16k</container>
    <container size="10">Octaves</container>
    <container size="10">Octave_value</container>
  </data-containers>
  <input>
    <audio>
      <output component="out">recording</output>
      <output component="rate">rate</output>
    </audio>
  </input>
  <analysis sleep="0.05" dynamicSleep="period">
    <timer>
      <output as="out">tnow</output>
    </timer>
    <append>
      <input keep="true">recording_subrange</input>
      <input keep="true">recording</input>
      <output>appended_recording</output>
    </append>
    <count>
      <input as="buffer" keep="true">appended_recording</input>
      <output>recording_length</output>
    </count>
    <subtract>
      <input>recording_length</input>
      <input keep="true">samples</input>
      <output>subrange_start</output>
    </subtract>
    <subrange>
      <input as="from" keep="true">subrange_start</input>
      <input as="in" keep="true">appended_recording</input>
      <output as="out">recording_subrange</output>
    </subrange>
    <count>
      <input as="buffer" keep="true">recording_subrange</input>
      <output>actual_samples</output>
    </count>
    <add>
      <input keep="true">actual_samples</input>
      <input type="value">1</input>
      <output>actual_samples+1</output>
    </add>
    <divide>
      <input keep="true">actual_samples</input>
      <input type="value">2</input>
      <output>actual_samples/2</output>
    </divide>
    <add>
      <input keep="true">actual_samples/2</input>
      <input type="value">1</input>
      <output>actual_samples/2+1</output>
    </add>
    <divide>
      <input keep="true">actual_samples</input>
      <input keep="true">rate</input>
      <output>period</output>
    </divide>
    <divide>
      <input type="value">1</input>
      <input keep="true">period</input>
      <output>df</output>
    </divide>
    <divide>
      <input keep="true">rate</input>
      <input type="value">2</input>
      <output>rate/2</output>
    </divide>
    <ramp>
      <input as="start" type="value">0</input>
      <input as="stop" keep="true">period</input>
      <input as="length" keep="true">actual_samples+1</input>
      <output>time</output>
    </ramp>
    <ramp>
      <input as="start" type="value">0</input>
      <input as="stop" keep="true">rate/2</input>
      <input as="length" keep="true">actual_samples/2+1</input>
      <output>frequency</output>
    </ramp>
    <fft>
      <input as="re" keep="true">recording_subrange</input>
      <output as="re">fftX</output>
      <output as="im">fftY</output>
    </fft>
    <subrange>
      <input as="from" type="value">1</input>
      <input as="to" keep="true">actual_samples/2</input>
      <input as="in">frequency</input>
      <input as="in">fftX</input>
      <input as="in">fftY</input>
      <output as="out">halfFrequency</output>
      <output as="out">halfFFTtempX</output>
      <output as="out">halfFFTtempY</output>
    </subrange>
    <formula formula="sqrt([1_]*[1_]+[2_]*[2_])">
      <input>halfFFTtempX</input>
      <input>halfFFTtempY</input>
      <output>fft</output>
    </formula>
    <average>
      <input as="buffer" keep="true">fft</input>
      <output as="average" append="true">a</output>
    </average>
    <integrate>
      <input as="in" keep="true">fft</input>
      <output>asum</output>
    </integrate>
    <max>
      <input as="y" keep="true">fft</input>
      <input as="x" keep="true">halfFrequency</input>
      <output as="position" append="true">f0</output>
      <output as="max">f1y</output>
    </max>
    <match>
      <input as="in">tnow</input>
      <input as="in">a</input>
      <output as="out">t</output>
      <output as="out">amplitude</output>
    </match>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">22.27</input>
      <input as="max" type="value">44.54</input>
      <output as="out">FFT31,5</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT31,5</input>
      <output>asum31,5</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT31,5</input>
      <output as="average" append="true">a31,5</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">44.54</input>
      <input as="max" type="value">89.1</input>
      <output as="out">FFT63</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT63</input>
      <output>asum63</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT63</input>
      <output as="average" append="true">a63</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">89.1</input>
      <input as="max" type="value">178.19</input>
      <output as="out">FFT125</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT125</input>
      <output>asum125</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT125</input>
      <output as="average" append="true">a125</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">178.19</input>
      <input as="max" type="value">356.38</input>
      <output as="out">FFT250</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT250</input>
      <output>asum250</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT250</input>
      <output as="average" append="true">a250</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">356.38</input>
      <input as="max" type="value">712.76</input>
      <output as="out">FFT500</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT500</input>
      <output>asum500</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT500</input>
      <output as="average" append="true">a500</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">712.76</input>
      <input as="max" type="value">1425.53</input>
      <output as="out">FFT1K</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT1K</input>
      <output>asum1k</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT1K</input>
      <output as="average" append="true">a1k</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">1425.53</input>
      <input as="max" type="value">2851.05</input>
      <output as="out">FFT2K</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT2K</input>
      <output>asum2k</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT2K</input>
      <output as="average" append="true">a2k</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">2851.05</input>
      <input as="max" type="value">5702.11</input>
      <output as="out">FFT4K</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT4K</input>
      <output>asum4k</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT4K</input>
      <output as="average" append="true">a4k</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">5702.11</input>
      <input as="max" type="value">11404.22</input>
      <output as="out">FFT8K</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT8K</input>
      <output>asum8k</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT8K</input>
      <output as="average" append="true">a8k</output>
    </average>
    <rangefilter>
      <input as="in" keep="true">fft</input>
      <input as="in" keep="true">halfFrequency</input>
      <input as="min" type="value">11404.22</input>
      <input as="max" type="value">22808.44</input>
      <output as="out">FFT16K</output>
    </rangefilter>
    <integrate>
      <input as="in" keep="true">FFT16K</input>
      <output>asum16k</output>
    </integrate>
    <average>
      <input as="buffer" keep="true">FFT16K</input>
      <output as="average" append="true">a16k</output>
    </average>
    <append>
      <input keep="true">f2</input>
      <input keep="true">f2</input>
      <output>f2x</output>
    </append>
    <append>
      <input type="value">1</input>
      <input type="value">2</input>
      <input type="value">3</input>
      <input type="value">4</input>
      <input type="value">5</input>
      <input type="value">6</input>
      <input type="value">7</input>
      <input type="value">8</input>
      <input type="value">9</input>
      <input type="value">10</input>
      <output append="true">Octaves</output>
    </append>
    <append>
      <input keep="true">asum31,5</input>
      <input keep="true">asum63</input>
      <input keep="true">asum125</input>
      <input keep="true">asum250</input>
      <input keep="true">asum500</input>
      <input keep="true">asum1k</input>
      <input keep="true">asum2k</input>
      <input keep="true">asum4k</input>
      <input keep="true">asum8k</input>
      <input keep="true">asum16k</input>
      <output>Octave_value</output>
    </append>
  </analysis>
  <views>
    <view label="Octave">
      <value label="Octave 1, 31.5 Hz">
        <input>asum31,5</input>
      </value>
      <value label="Octave 2, 63 Hz">
        <input>asum63</input>
      </value>
      <value label="Octave 3, 125 Hz">
        <input>asum125</input>
      </value>
      <value label="Octave 4, 250 Hz">
        <input>asum250</input>
      </value>
      <value label="Octave 5, 500 Hz">
        <input>asum500</input>
      </value>
      <value label="Octave 6, 1 kHz">
        <input>asum1k</input>
      </value>
      <value label="Octave 7, 2 kHz">
        <input>asum2k</input>
      </value>
      <value label="Octave 8, 4 kHz">
        <input>asum4k</input>
      </value>
      <value label="Octave 9, 8 kHz">
        <input>asum8k</input>
      </value>
      <value label="Octave 10, 16 kHz">
        <input>asum16k</input>
      </value>
      <separator></separator>
      <graph label="Fourier Transform" labelX="Frequency" labelY="FFT Mag" unitX="[[unit_short_hertz]]" unitY="[[unit_short_arbitrary_unit]]" logX="true" logY="true">
        <input axis="x">halfFrequency</input>
        <input axis="y">fft</input>
      </graph>
      <separator></separator>
      <graph label="octaves" style="dots" labelX="Frequency Octave" labelY="Mag" unitY="[[unit_short_arbitrary_unit]]" logY="true" xPrecision="1" scaleMinX="fixed" scaleMinY="fixed" minY="1" scaleMaxX="fixed" scaleMaxY="extend" maxX="10" lineWidth="5" color="orange">
        <input axis="x">Octaves</input>
        <input axis="y">Octave_value</input>
      </graph>
      <value label="summering">
        <input>asum</input>
      </value>
      <button label="Clear">
        <input type="empty"></input>
        <output>t</output>
        <input type="empty"></input>
        <output>amplitude</output>
      </button>
    </view>
    <view label="Raw data">
      <graph label="Recording" labelX="[[quantity_short_time]]" labelY="Amplitude" unitX="[[unit_short_second]]" unitY="[[unit_short_arbitrary_unit]]">
        <input axis="x">time</input>
        <input axis="y">recording_subrange</input>
      </graph>
    </view>
  </views>
  <export>
    <set name="Amplitude">
      <data name="time (s)">t</data>
      <data name="Amplitude (a.u.)">amplitude</data>
    </set>
    <set name="Raw data">
      <data name="Time (s)">time</data>
      <data name="Recording (a.u.)">recording_subrange</data>
    </set>
  </export>
</phyphox>