From 388ab13db1c2a10534a9b81acba8fef98d96409c Mon Sep 17 00:00:00 2001 From: Shane Nelson Date: Sat, 27 Jun 2015 17:45:31 -0400 Subject: [PATCH] Audio: new dsp_coef.bin with windowed sinc filter coefficients --- Data/Sys/GC/dsp_coef.bin | Bin 4096 -> 4096 bytes Source/Core/Core/DSP/DSPCore.cpp | 7 +++++-- docs/DSP/free_dsp_rom/dsp_rom_readme.txt | 13 ++++++++++++ docs/DSP/free_dsp_rom/generate_coefs.py | 25 +++++++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 docs/DSP/free_dsp_rom/generate_coefs.py diff --git a/Data/Sys/GC/dsp_coef.bin b/Data/Sys/GC/dsp_coef.bin index a276f2cede1a8e6936b4526f9621a391ca6b9515..1137fd741ec917caab4716a3ef5d8374ef246e5a 100644 GIT binary patch literal 4096 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 IV5Eis042A8!2kdN literal 4096 zcmZQzU|^{K4D>KPcpj5-D;FkQ>Q45n)sSip2O11p%WVqgQ)l??1)x`KfNOqVlo zg6T2_E-+onzzwEL7|#tGf0BzGzKX!oys5$rc)SXz;rT$ESOGWkOR|+4Dw() zfk6RG$1^B`={N=@FdfUF45nikRKRpJgDRMgVo(Fqkqqi!I)Xt1OouaQg6S{@EifI* zpbe%&7<9mNFoQ0b4r0&)(}4{7U^;-o08INc7=md(1|u--%U}$qeHcu@v^Rq(nD$~Y z1Jj-i=3v@`!2(RXGgyLYHwG&(?aE*crd=3pz_c@iEtqylt7<|CA zF@rCdHe&Dt(}oQGVA_Bo08HyM1cGTjh9EGl%Mc8vbr?dxv^GO1nATzl1Jjxe;b2;W zAp%URGem-EHHIiKt;!G$rd1eXz_c<$ESOeehy&A#4Dn!Efgu4*%QGZ`X*q@@FfGfF z45nomQoyt{Ln@e-Vn_qik__o!T7n@1Op7yQf@v{^EHEv~kPW6q7;?b0Fheew7GlT) z(}E27U|N8o08H~U6oP3!h9WS{%TNrac^FE-G&e&jnC4rdb$jz%(;MEtqCvr~}iC4E11oH2;t0e^5dg&HtnMACwM8>;KXEACwM8 W>;I8a|AXRs6px0$Xb6nF5C8yeD8l;y diff --git a/Source/Core/Core/DSP/DSPCore.cpp b/Source/Core/Core/DSP/DSPCore.cpp index 54262ede66..bfe7c64b6c 100644 --- a/Source/Core/Core/DSP/DSPCore.cpp +++ b/Source/Core/Core/DSP/DSPCore.cpp @@ -42,7 +42,10 @@ static bool VerifyRoms() // delroth's improvement on LM1234 replacement ROM (Zelda and AX only, // IPL/Card/GBA still broken) - { 0xd9907f71, 0xb019c2fb } + { 0xd9907f71, 0xb019c2fb }, + + // above with improved resampling coefficients + { 0xd9907f71, 0xdb6880c1 } }; u32 hash_irom = HashAdler32((u8*)g_dsp.irom, DSP_IROM_BYTE_SIZE); @@ -69,7 +72,7 @@ static bool VerifyRoms() DSPHost::OSD_AddMessage("You are using an old free DSP ROM made by the Dolphin Team.", 6000); DSPHost::OSD_AddMessage("Only games using the Zelda UCode will work correctly.", 6000); } - else if (rom_idx == 2) + else if (rom_idx == 2 || rom_idx == 3) { DSPHost::OSD_AddMessage("You are using a free DSP ROM made by the Dolphin Team.", 8000); DSPHost::OSD_AddMessage("All Wii games will work correctly, and most GC games should ", 8000); diff --git a/docs/DSP/free_dsp_rom/dsp_rom_readme.txt b/docs/DSP/free_dsp_rom/dsp_rom_readme.txt index bcaa2eee43..7dc073a80b 100644 --- a/docs/DSP/free_dsp_rom/dsp_rom_readme.txt +++ b/docs/DSP/free_dsp_rom/dsp_rom_readme.txt @@ -1,3 +1,16 @@ +Legal GC/WII DSP IROM replacement (v0.2.1) +------------------------------------------------------- + +- coef: 4-tap polyphase FIR filters +- irom: unchanged + +Coefficients are roughly equivalent to those in the official DROM. +Improves resampling quality greatly over linear interpolation. +See generate_coefs.py for details. + +stgn +29/june/2015 + Legal GC/WII DSP IROM replacement (v0.2) ------------------------------------------------------- diff --git a/docs/DSP/free_dsp_rom/generate_coefs.py b/docs/DSP/free_dsp_rom/generate_coefs.py new file mode 100644 index 0000000000..5b1771429d --- /dev/null +++ b/docs/DSP/free_dsp_rom/generate_coefs.py @@ -0,0 +1,25 @@ +from numpy import * +from struct import pack + +def pack_coefs(c): + cw = list(zip(c[ :128][::-1], + c[128:256][::-1], + c[256:384][::-1], + c[384: ][::-1])) + m = max(sum(x) for x in cw) + return b''.join(pack('>4h', *(int(round(n / m * 32767)) for n in x)) for x in cw) + +x = linspace(-2, 2, 512, endpoint=False) + +w1 = hamming(512) +w2 = kaiser(512, pi * 9/4) + +coef_1 = [sinc(n * 0.5) for n in x] * w1 +coef_2 = [sinc(n * 0.75) for n in x] * w2 +coef_3 = [sinc(n) for n in x] * w1 + +with open('dsp_coef.bin', 'wb') as f: + f.write(pack_coefs(coef_1)) + f.write(pack_coefs(coef_2)) + f.write(pack_coefs(coef_3)) + f.write(b'\0' * 1024)