NE · Kapitel 12 · Einheit 4

Sprachsignale

Im weiteren Verlauf beschäftigen wir uns vor allem mit der Modulation von Sprache. Dazu müssen wir zunächst verstehen, was Sprache eigentlich ausmacht. Wenn wir sprechen, entstehen viele verschiedene tiefe und hohe sowie leise und laute Töne als Schallwellen. Wir nennen dies ein Sprachsignal.

Sprechen wir in ein Mikrofon, dann wandelt es das Sprachsignal um. Aus den tiefen und hohen sowie leisen und lauten Tönen werden langsame und schnelle elektrische Schwingungen mit kleiner und große Amplitude. Das Sprachsignal liegt nicht mehr als Schallwelle, sondern als elektrische Schwingung vor und kann im Funkgerät verarbeitet werden.

In Abbildung NE-12.4.1 sehen wir ein typisches Sprachsignal als Amplitudenspektrum. Der Frequenzbereich von $\qtyrange{0}{20}{\kilo\hertz}$ wird gezeigt. Die Kurve stellt die Amplitude für die jeweilige Frequenz dar. Es lässt sich gut erkennen, dass Sprache nicht beliebig hohe Frequenzen enthält. Für Funkübertragungen wird sogar oft ein noch weiter eingeschränkter Frequenzbereich genutzt.
<script src="/lernen/jquery/3.7.1/jquery.min.js"></script> <script src="/lernen/chartjs/4.4.1/chart.min.js"></script>
<p>
Durch Druck auf den nächsten Button, wird das Mikrofon des Browsers
aktiviert. Danach kann man das Spektrum der eigenen Sprache betrachten.
</p>
<p>
    <button onclick="start()">Mikrofon Einschalten</button>
</p>
<p>
    <canvas id="Spectrum" style="max-height:200px;"></canvas>
</p>
Stärkste Amplitude bei der Frequenz $f$ = <div id="mainfrequency" style="display:inline-block;">0</div> $Hz$<br>

<script type="text/javascript">

    spectrum = new Chart("Spectrum", {
        type: 'scatter',
        data: {
            labels: [],
            datasets: [
                {
                    fill: false,
                    pointRadius: function(context) {
                        var index = context.dataIndex;
                        var value = context.dataset.data[index];
                        var max = Math.max.apply(null,context.dataset.data);
                        return value == max ? 6 : 0;
                    },
                    lineTension: 0.8,
                    showLine: true,
                    borderColor: function(context) { 
                        var index = context.dataIndex;
                        var value = context.dataset.data[index];
                        var max = Math.max.apply(null,context.dataset.data);
                        return value == max ? "#FF756D" : "#00AEDF";
                    },
                    data: [],
                },
            ]
        },    
        options: {
            responsive:true,
            plugins: {
                legend: {
                    display: false,
                }
            },
            scales: {
                y: {
                    min: 0,
                    max: 100,
                    ticks: {
                        callback: function(value, index, ticks) {
                            return value + "%";
                        }
                    }
                },
                x: {
                    min: 0,
                    max: 24000,
                    type: 'logarithmic',
                    title: {
                        display: true,
                        text: 'Frequenz'
                    },
                    ticks: {
                        callback: function(val, index) {
                            return val+"Hz";
                        },
                    }
                }
            },
        }
    });

    var initialized = false;
    var binSize = 0;

    const getBigBinIndex = (frequencyBins) => {
        let biggestIndex = 0;
        frequencyBins.forEach((bin, index) => {
            if (bin > frequencyBins[biggestIndex]) {
                biggestIndex = index;
            }
        });

        return biggestIndex;
    }

    const init = () => {
        var fftSize = 2048;
        var audioContext;

        var analyserNode;
        var frequencyData;
        var lastUpdate = 0;

        try {
            window.AudioContext = window.AudioContext || window.webkitAudioContext;
            audioContext = new AudioContext();
            binSize = (audioContext.sampleRate) / fftSize; // Bin Size in Hz
        } catch (e) {
            alert('Die Web Audio API wird in diesem Browser leider nicht unterstützt!');
        }

        const update = (timestamp) => {
            if (timestamp - lastUpdate > 50) {
                analyserNode.getByteFrequencyData(frequencyData);
                const bigBinIndex = getBigBinIndex(frequencyData);
                const mainFrequencyStart = Math.floor(bigBinIndex * audioContext.sampleRate / fftSize);

                const mainfrequencyDomElement = document.getElementById('mainfrequency');
                mainfrequencyDomElement.textContent = mainFrequencyStart;

                lastUpdate = timestamp;

                // Reset all values:
                spectrum.data.datasets[0].data = [];
                spectrum.data.labels = [];

                // Normalize Apmlitudes:
                for(let i = 0; i < analyserNode.frequencyBinCount; i++) {
                    // Store Normalized Amplitude
                    spectrum.data.datasets[0].data.push((frequencyData[i]/255)*100); 
                    spectrum.data.labels.push(i*binSize);
                }

                // Update Graphs:
                spectrum.update();
            }
            requestAnimationFrame(update);
        }

        // Acquire microphone access.
        navigator.mediaDevices.getUserMedia({
            audio: true,
            video: false
        }).then(stream => {
            var source = audioContext.createMediaStreamSource(stream);
            analyserNode = audioContext.createAnalyser(source);
            analyserNode.fftSize = fftSize;
            audioContext.resume();
            source.connect(analyserNode);
            console.log(analyserNode.frequencyBinCount);
            frequencyData = new Uint8Array(analyserNode.frequencyBinCount)
            window.requestAnimationFrame(update);
        });
    }

    const start = () => {
        if(initialized == false){
            init();
            initialized = true;
        }
    }
    
</script>

In Abbildung NE-12.4.2 sehen wir die symbolische Darstellung eines Sprachspektrums. Auf der X-Achse von links nach rechts werden unterschiedliche Frequenzen dargestellt. Tiefe Töne mit kleineren Frequenzen finden sich weiter links als hohe Töne mit höheren Frequenzen, die weiter rechts zu finden sind. Auf der Y-Achse von unten nach oben ist die Lautstärke der jeweiligen Frequenz dargestellt, fachsprachlich nennen wir dies die Amplitude. Je weiter oben, umso lauter ist der Ton.

In der Abbildung NE-12.4.3 findet sich ein konkretes Beispiel. Es ist ein genutzter Frequenzbereich von $\qtyrange{300}{2700}{\hertz}$ abzulesen. Die "Breite" des Signals wird übrigens als Bandbreite bezeichnet und in Hertz ($Hz$) angegeben. Die Bandbreite beträgt in diesem Falle $2700 Hz$ - $300 Hz$ = $2400 Hz$.

Dieses beispielhafte Sprachsignal werden wir verwenden, um Träger zu modulieren. Ein Signal, mit dem ein Träger moduliert wird, wird als Modulationssignal bezeichnet.