aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Tests/Audio/Renderer/Dsp/UpsamplerTests.cs
blob: 2018752b3ab6f0b17860d1b46c3c9521ead7a508 (plain) (blame)
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
using NUnit.Framework;
using Ryujinx.Audio.Renderer.Dsp;
using Ryujinx.Audio.Renderer.Parameter;
using Ryujinx.Audio.Renderer.Server.Upsampler;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace Ryujinx.Tests.Audio.Renderer.Dsp
{
    class UpsamplerTests
    {
        [Test]
        public void TestUpsamplerConsistency()
        {
            UpsamplerBufferState bufferState = new UpsamplerBufferState();
            int inputBlockSize = 160;
            int numInputSamples = 32000;
            int numOutputSamples = 48000;
            float inputSampleRate = numInputSamples;
            float outputSampleRate = numOutputSamples;
            float[] inputBuffer = new float[numInputSamples + 100];
            float[] outputBuffer = new float[numOutputSamples + 100];
            for (int sample = 0; sample < inputBuffer.Length; sample++)
            {
                // 440 hz sine wave with amplitude = 0.5f at input sample rate
                inputBuffer[sample] = MathF.Sin((440 / inputSampleRate) * (float)sample * MathF.PI * 2f) * 0.5f;
            }

            int inputIdx = 0;
            int outputIdx = 0;
            while (inputIdx + inputBlockSize < numInputSamples)
            {
                int outputBufLength = (int)Math.Round((float)(inputIdx + inputBlockSize) * outputSampleRate / inputSampleRate) - outputIdx;
                UpsamplerHelper.Upsample(
                    outputBuffer.AsSpan(outputIdx),
                    inputBuffer.AsSpan(inputIdx),
                    outputBufLength,
                    inputBlockSize,
                    ref bufferState);

                inputIdx += inputBlockSize;
                outputIdx += outputBufLength;
            }

            float[] expectedOutput = new float[numOutputSamples];
            float sumDifference = 0;
            for (int sample = 0; sample < numOutputSamples; sample++)
            {
                // 440 hz sine wave with amplitude = 0.5f at output sample rate with an offset of 15
                expectedOutput[sample] = MathF.Sin((440 / outputSampleRate) * (float)(sample - 15) * MathF.PI * 2f) * 0.5f;
                sumDifference += Math.Abs(expectedOutput[sample] - outputBuffer[sample]);
            }

            sumDifference = sumDifference / (float)expectedOutput.Length;
            // Expect the output to be 98% similar to the expected resampled sine wave
            Assert.IsTrue(sumDifference < 0.02f);
        }
    }
}