diff options
| author | 2023-01-14 17:09:03 +0000 | |
|---|---|---|
| committer | 2023-01-14 17:09:03 +0000 | |
| commit | a0e8e5b22e87a033c9c9b31d57567d2d2639e7cf (patch) | |
| tree | 5b1c7dc13d84c440c4ee96287c325d1d8b4aa859 /src | |
| parent | audio_core: Fix off-by-one error in upsampler (diff) | |
| download | yuzu-a0e8e5b22e87a033c9c9b31d57567d2d2639e7cf.tar.gz yuzu-a0e8e5b22e87a033c9c9b31d57567d2d2639e7cf.tar.xz yuzu-a0e8e5b22e87a033c9c9b31d57567d2d2639e7cf.zip | |
upsample: Fix coefficient format
Diffstat (limited to '')
| -rw-r--r-- | src/audio_core/renderer/command/resample/upsample.cpp | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/src/audio_core/renderer/command/resample/upsample.cpp b/src/audio_core/renderer/command/resample/upsample.cpp index 1e5fd3e28..5f7db12ca 100644 --- a/src/audio_core/renderer/command/resample/upsample.cpp +++ b/src/audio_core/renderer/command/resample/upsample.cpp | |||
| @@ -20,25 +20,25 @@ static void SrcProcessFrame(std::span<s32> output, std::span<const s32> input, | |||
| 20 | const u32 target_sample_count, const u32 source_sample_count, | 20 | const u32 target_sample_count, const u32 source_sample_count, |
| 21 | UpsamplerState* state) { | 21 | UpsamplerState* state) { |
| 22 | constexpr u32 WindowSize = 10; | 22 | constexpr u32 WindowSize = 10; |
| 23 | constexpr std::array<Common::FixedPoint<24, 8>, WindowSize> SincWindow1{ | 23 | constexpr std::array<Common::FixedPoint<17, 15>, WindowSize> WindowedSinc1{ |
| 24 | 51.93359375f, -18.80078125f, 9.73046875f, -5.33203125f, 2.84375f, | 24 | 0.95376587f, -0.12872314f, 0.060028076f, -0.032470703f, 0.017669678f, |
| 25 | -1.41015625f, 0.62109375f, -0.2265625f, 0.0625f, -0.00390625f, | 25 | -0.009124756f, 0.004272461f, -0.001739502f, 0.000579834f, -0.000091552734f, |
| 26 | }; | 26 | }; |
| 27 | constexpr std::array<Common::FixedPoint<24, 8>, WindowSize> SincWindow2{ | 27 | constexpr std::array<Common::FixedPoint<17, 15>, WindowSize> WindowedSinc2{ |
| 28 | 105.35546875f, -24.52734375f, 11.9609375f, -6.515625f, 3.52734375f, | 28 | 0.8230896f, -0.19161987f, 0.093444824f, -0.05090332f, 0.027557373f, |
| 29 | -1.796875f, 0.828125f, -0.32421875f, 0.1015625f, -0.015625f, | 29 | -0.014038086f, 0.0064697266f, -0.002532959f, 0.00079345703f, -0.00012207031f, |
| 30 | }; | 30 | }; |
| 31 | constexpr std::array<Common::FixedPoint<24, 8>, WindowSize> SincWindow3{ | 31 | constexpr std::array<Common::FixedPoint<17, 15>, WindowSize> WindowedSinc3{ |
| 32 | 122.08203125f, -16.47656250f, 7.68359375f, -4.15625000f, 2.26171875f, | 32 | 0.6298828f, -0.19274902f, 0.09725952f, -0.05319214f, 0.028625488f, |
| 33 | -1.16796875f, 0.54687500f, -0.22265625f, 0.07421875f, -0.01171875f, | 33 | -0.014373779f, 0.006500244f, -0.0024719238f, 0.0007324219f, -0.000091552734f, |
| 34 | }; | 34 | }; |
| 35 | constexpr std::array<Common::FixedPoint<24, 8>, WindowSize> SincWindow4{ | 35 | constexpr std::array<Common::FixedPoint<17, 15>, WindowSize> WindowedSinc4{ |
| 36 | 23.73437500f, -9.62109375f, 5.07812500f, -2.78125000f, 1.46875000f, | 36 | 0.4057312f, -0.1468811f, 0.07601929f, -0.041656494f, 0.022216797f, |
| 37 | -0.71484375f, 0.30859375f, -0.10546875f, 0.02734375f, 0.00000000f, | 37 | -0.011016846f, 0.004852295f, -0.0017700195f, 0.00048828125f, -0.000030517578f, |
| 38 | }; | 38 | }; |
| 39 | constexpr std::array<Common::FixedPoint<24, 8>, WindowSize> SincWindow5{ | 39 | constexpr std::array<Common::FixedPoint<17, 15>, WindowSize> WindowedSinc5{ |
| 40 | 80.62500000f, -24.67187500f, 12.44921875f, -6.80859375f, 3.66406250f, | 40 | 0.1854248f, -0.075164795f, 0.03967285f, -0.021728516f, 0.011474609f, |
| 41 | -1.83984375f, 0.83203125f, -0.31640625f, 0.09375000f, -0.01171875f, | 41 | -0.005584717f, 0.0024108887f, -0.0008239746f, 0.00021362305f, 0.0f, |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | if (!state->initialized) { | 44 | if (!state->initialized) { |
| @@ -91,8 +91,8 @@ static void SrcProcessFrame(std::span<s32> output, std::span<const s32> input, | |||
| 91 | static_cast<u16>((state->history_output_index + 1) % UpsamplerState::HistorySize); | 91 | static_cast<u16>((state->history_output_index + 1) % UpsamplerState::HistorySize); |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | auto calculate_sample = [&state](std::span<const Common::FixedPoint<24, 8>> coeffs1, | 94 | auto calculate_sample = [&state](std::span<const Common::FixedPoint<17, 15>> coeffs1, |
| 95 | std::span<const Common::FixedPoint<24, 8>> coeffs2) -> s32 { | 95 | std::span<const Common::FixedPoint<17, 15>> coeffs2) -> s32 { |
| 96 | auto output_index{state->history_output_index}; | 96 | auto output_index{state->history_output_index}; |
| 97 | u64 result{0}; | 97 | u64 result{0}; |
| 98 | 98 | ||
| @@ -129,23 +129,23 @@ static void SrcProcessFrame(std::span<s32> output, std::span<const s32> input, | |||
| 129 | break; | 129 | break; |
| 130 | 130 | ||
| 131 | case 1: | 131 | case 1: |
| 132 | output[write_index] = calculate_sample(SincWindow3, SincWindow4); | 132 | output[write_index] = calculate_sample(WindowedSinc1, WindowedSinc5); |
| 133 | break; | 133 | break; |
| 134 | 134 | ||
| 135 | case 2: | 135 | case 2: |
| 136 | output[write_index] = calculate_sample(SincWindow2, SincWindow1); | 136 | output[write_index] = calculate_sample(WindowedSinc2, WindowedSinc4); |
| 137 | break; | 137 | break; |
| 138 | 138 | ||
| 139 | case 3: | 139 | case 3: |
| 140 | output[write_index] = calculate_sample(SincWindow5, SincWindow5); | 140 | output[write_index] = calculate_sample(WindowedSinc3, WindowedSinc3); |
| 141 | break; | 141 | break; |
| 142 | 142 | ||
| 143 | case 4: | 143 | case 4: |
| 144 | output[write_index] = calculate_sample(SincWindow1, SincWindow2); | 144 | output[write_index] = calculate_sample(WindowedSinc4, WindowedSinc2); |
| 145 | break; | 145 | break; |
| 146 | 146 | ||
| 147 | case 5: | 147 | case 5: |
| 148 | output[write_index] = calculate_sample(SincWindow4, SincWindow3); | 148 | output[write_index] = calculate_sample(WindowedSinc5, WindowedSinc1); |
| 149 | break; | 149 | break; |
| 150 | } | 150 | } |
| 151 | state->sample_index = static_cast<u8>((state->sample_index + 1) % 6); | 151 | state->sample_index = static_cast<u8>((state->sample_index + 1) % 6); |
| @@ -162,11 +162,11 @@ static void SrcProcessFrame(std::span<s32> output, std::span<const s32> input, | |||
| 162 | break; | 162 | break; |
| 163 | 163 | ||
| 164 | case 1: | 164 | case 1: |
| 165 | output[write_index] = calculate_sample(SincWindow2, SincWindow1); | 165 | output[write_index] = calculate_sample(WindowedSinc2, WindowedSinc4); |
| 166 | break; | 166 | break; |
| 167 | 167 | ||
| 168 | case 2: | 168 | case 2: |
| 169 | output[write_index] = calculate_sample(SincWindow1, SincWindow2); | 169 | output[write_index] = calculate_sample(WindowedSinc4, WindowedSinc2); |
| 170 | break; | 170 | break; |
| 171 | } | 171 | } |
| 172 | state->sample_index = static_cast<u8>((state->sample_index + 1) % 3); | 172 | state->sample_index = static_cast<u8>((state->sample_index + 1) % 3); |
| @@ -183,12 +183,12 @@ static void SrcProcessFrame(std::span<s32> output, std::span<const s32> input, | |||
| 183 | break; | 183 | break; |
| 184 | 184 | ||
| 185 | case 1: | 185 | case 1: |
| 186 | output[write_index] = calculate_sample(SincWindow1, SincWindow2); | 186 | output[write_index] = calculate_sample(WindowedSinc4, WindowedSinc2); |
| 187 | break; | 187 | break; |
| 188 | 188 | ||
| 189 | case 2: | 189 | case 2: |
| 190 | increment(); | 190 | increment(); |
| 191 | output[write_index] = calculate_sample(SincWindow2, SincWindow1); | 191 | output[write_index] = calculate_sample(WindowedSinc2, WindowedSinc4); |
| 192 | break; | 192 | break; |
| 193 | } | 193 | } |
| 194 | state->sample_index = static_cast<u8>((state->sample_index + 1) % 3); | 194 | state->sample_index = static_cast<u8>((state->sample_index + 1) % 3); |