ã»ãšãã©å¿ããããŠããæãã¬ã¹ãã©ã³ã§æµãå§ããŸããã ããªãã¯é ãæã«åœŒå¥³ã«è³ãåŸããŸããã æåçãªèšæ¶ãã©ãã ãåé³ãèšèãåŒãèµ·ããå¯èœæ§ããããŸãã...ããªãã¯å¿
æ»ã«ãã®æãããäžåºŠèŽããããšæããŸããããã®ååã¯é ããå®å
šã«é£ã³åºããŸããïŒ ã«ãªãæ¹æ³ 幞ããªããšã«ãç§ãã¡ã®çŽ æŽããããã€ãã¯ã®äžçã§ã¯ããã®è³ªåã«å¯ŸããçãããããŸãã
ããªãã®ãã±ããã«ã¯ãé³æ¥œãèªèããããã®ããã°ã©ã ãã€ã³ã¹ããŒã«ãããŠããã¹ããŒããã©ã³ããããŸãã ãã®ããã°ã©ã ã¯ããªãã®æäžäž»ã§ãã æ²ã®ååãèŠã€ããããã«ãèªåã®èšæ¶ãã倧åãªè¡ãæœåºããããã«é
ããé
ãŸã§ç§»åããå¿
èŠã¯ãããŸããã ãããŠããããããŸããããšããäºå®ã§ã¯ãããŸããã ããã°ã©ã ã¯ãé³æ¥œããèãããšãããã«äœæ²ã®ååãç¥ãããŸãã ãã®åŸãå¿ã«åªããé³ãäœåºŠãèãããšãã§ããããã«ãªããŸãã 圌ããããªããšäžã€ã«ãªããŸã§ããŸãã¯ããªããããã®ãã¹ãŠã«é£œãããŸã§ã
ã¢ãã€ã«ãã¯ãããžãŒãšãµãŠã³ãåŠçã®åéã«ãããé©ãã¹ãé²æ©ã«ããã
ã¢ã«ãŽãªãºã éçºè
ã¯é³æ¥œäœåãèªèããããã®ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã ãã®çš®ã®æãäžè¬çãªãœãªã¥ãŒã·ã§ã³ã®1ã€ã¯
ShazamãšåŒã°ããŸãã 20ç§ã®ãµãŠã³ããäžããå Žåãã€ã³ãããã³ãŒã©ã¹ããŸãã¯äž»èŠãªåæ©ã®äžéšã§ãããã©ããã¯é¢ä¿ãããŸãããShazamã¯çœ²åã³ãŒããäœæããããŒã¿ããŒã¹ããã§ãã¯ããç¬èªã®é³æ¥œèªèã¢ã«ãŽãªãºã ã䜿çšããŠäœåã®ååãäŒããŸãã
ããã¯ã©ã®ããã«æ©èœããŸããïŒ
2003幎ã®åºæ¬çãª
Shazamã¢ã«ãŽãªãºã ã®èª¬æã¯ãäœæè
ã®Avery Li-Chung Wangã«ãã£ãŠå
¬éãããŸããã ãã®èšäºã§ã¯ãShazamé³æ¥œèªèã¢ã«ãŽãªãºã ã®åºæ¬ã詳现ã«åæããŸãã
ã¢ããã°ããããžã¿ã«ãžïŒé¢æ£å
æ¬åœã«é³ãšã¯äœã§ããïŒ ãã¶ããããã¯ç§ãã¡ã®è³ã«æµžéããç§ãã¡ãèãããšãå¯èœã«ããäžæè°ãªäœå
ç©è³ªã§ããïŒ
ãã¡ããããã¹ãŠãããã»ã©ç¥ç§çã§ã¯ãããŸããã é³ã¯ã匟æ§æ³¢ã®åœ¢ã§åºäœã液äœãæ°äœã®åªäœãäŒæãã
æ©æ¢°çæ¯åã§ããããšãé·ãéç¥ãããŠããŸãã æ³¢ãè³ãç¹ã«éŒèã«å°éãããšãè³å°éªšãåãå§ãããããæ¯åãããã«å
è³ã«ããææ¯çŽ°èã«äŒããŸãã ãã®çµæãæ©æ¢°çæ¯åã¯é»æ°ã€ã³ãã«ã¹ã«å€æããããããèŽèŠç¥çµãä»ããŠè³ã«äŒéãããŸãã
é²é³ããã€ã¹ã¯ãäžèšã®ããã»ã¹ãéåžžã«æ£ç¢ºã«æš¡å£ããé³æ³¢ã®å§åãé»æ°ä¿¡å·ã«å€æããŸãã 空æ°äžã®é³æ³¢ã¯ãå§çž®ãšåžèåã®é åã§è¡šããã
é£ç¶ä¿¡å·ã§ãã ãã€ã¯ã¯ãé³å£°ä¿¡å·ãæåã«ééããé»åéšåã§ããããããé»æ°ä¿¡å·ã«å€æããŸãããé»æ°ä¿¡å·ã¯äŸç¶ãšããŠé£ç¶ããŠããŸãã ããžã¿ã«ã®äžçã§ã¯ããã®ãããªä¿¡å·ã¯ç¹ã«æçšã§ã¯ãªããããããžã¿ã«ã·ã¹ãã ã«ä¿åããŠåŠçããåã«ã
åå¥ã®åœ¢åŒã«å€æããå¿
èŠããããŸãã ããã¯ãä¿¡å·ã®æ¯å¹
ãè¡šãå€ããµã³ããªã³ã°ããããšã«ããè¡ãããŸãã
ãã®ãããªå€æã®éçšã§
ãã¢ããã°ä¿¡å·ã®
éååãè¡ãããŸãã å°æ°ã®ãšã©ãŒãªãã§ã¯ã§ããŸããã ãããã£ãŠãåæå€æãåŠçããã®ã§ã¯ãªãã
A / Dã³ã³ããŒã¿ãŒãå€ãã®æäœãå®è¡ããŠãã¢ããã°ä¿¡å·ã®ããäžéšãããžã¿ã«ã«å€æããŸãã ãã®ããã»ã¹ã¯ã
ãµã³ããªã³ã°ãŸãã¯ãµã³ããªã³ã°ãšåŒã°ããŸãã
ã¢ããã°ïŒé£ç¶ïŒããã³ããžã¿ã«ïŒé¢æ£ïŒä¿¡å·ã³ãã«ãã³ãã®å®çã«ãããç¹å®ã®åšæ³¢æ°ã«å¶éãããé£ç¶ä¿¡å·ãæ£ç¢ºã«è¡šãããã«å¿
èŠãªãµã³ããªã³ã°åšæ³¢æ°ãããããŸãã ç¹ã«ã人éã®è³ã«èãããé³ã®åšæ³¢æ°ã¹ãã¯ãã«å
šäœããã£ããã£ããã«ã¯ã人éãèãåšæ³¢æ°ã®äžéã®2åã®ãµã³ããªã³ã°åšæ³¢æ°ã䜿çšããå¿
èŠããããŸãã
ããªãã¡ã人ã¯çŽ20Hzãã20,000Hzã®ç¯å²ã®é³ãèãããšãã§ããŸãã ãã®çµæãã»ãšãã©ã®å Žåãé³ã¯44100 Hzã®ãµã³ããªã³ã°åšæ³¢æ°ã§èšé²ãããŸãã
CDã§äœ¿çšãããã®ã¯ãã®ãµã³ããªã³ã°ã¬ãŒãã§ãã
MPEG-1æšæºã®ã°ã«ãŒãïŒ
VCD ã
SVCD ã
MP3 ïŒã®ãµãŠã³ãã®ãšã³ã³ãŒãã«æããã䜿çšãããŸãã
44100 Hzã®ãµã³ããªã³ã°åšæ³¢æ°ã®æ®åã¯ãäž»ã«ãœããŒæ ªåŒäŒç€Ÿã«ãããã®ã§ãã ãã€ãŠããã®æ¹æ³ã§ãšã³ã³ãŒãããããªãŒãã£ãªãã©ãã¯ã¯ã
PAL ïŒ25ãã¬ãŒã /ç§ïŒããã³
NTSC ïŒ30ãã¬ãŒã /ç§ïŒ
èŠæ Œã®ãããªãšçµã¿åãããŠæ¢åã®æ©åšã䜿çšããŠäœæ¥ããã®ã«äŸ¿å©ã§ããã ãŸãããã®åšæ³¢æ°ãæ倧20,000 Hzã®ç¯å²ã§é«å質ã®é³å£°äŒéã«ååã§ããããšãéåžžã«éèŠã§ãã ãã®ãµã³ããªã³ã°ã¬ãŒãã䜿çšããããžã¿ã«ãªãŒãã£ãªæ©åšã¯ãããžã¿ã«ãµãŠã³ãæšæºãåºçŸããåœæã®ã¢ããã°æ©åšãšæ¯ã¹ãŠé«å質ã§ããã ãã®çµæãé²é³äžã«ãµãŠã³ãã®ãµã³ããªã³ã°åšæ³¢æ°ãéžæãããšãã»ãšãã©ã®å Žå44100 Hzã§åæ¢ããŸãã
é²é³ïŒãªãŒãã£ãªãã£ããã£
ãµã³ããªã³ã°ããããµãŠã³ãã®é²é³ã¯ãããªãç°¡åãªäœæ¥ã§ãã ææ°ã®ãµãŠã³ãã«ãŒãã«ã¯ãã¢ããã°-ããžã¿ã«ã³ã³ããŒã¿ãŒãçµã¿èŸŒãŸããŠããŸãã ãã®ãããããã°ã©ãã³ã°èšèªãéžæãããµãŠã³ããæäœããã®ã«é©ããã©ã€ãã©ãªãèŠã€ãããµã³ããªã³ã°åšæ³¢æ°ããã£ã³ãã«æ°ïŒéåžžãã¢ãã©ã«ããã³ã¹ãã¬ãªãµãŠã³ãã®å Žåã¯éåžž1ã€ãŸãã¯2ã€ïŒã瀺ãã1ã€ã®ãµã³ãã«ã®ãããæ°ãéžæããŸãïŒããšãã°ã16ãããããã䜿çšãããŸãïŒ ã 次ã«ãå
¥åã¹ããªãŒã ãéãããã«ããµãŠã³ãã«ãŒãããããŒã¿ã©ã€ã³ãéãããã®å
容ããã€ãé
åã«æžã蟌ãå¿
èŠããããŸãã Javaã§è¡ãæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
private AudioFormat getFormat() { float sampleRate = 44100; int sampleSizeInBits = 16; int channels = 1; // boolean signed = true; // , boolean bigEndian = true; // , (big-endian) (little-endian) return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian); } final AudioFormat format = getFormat(); // AudioFormat DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info); line.open(format); line.start();
次ã«ã
TargetDataLine
ã¯ã©ã¹ã®ãªããžã§ã¯ãããããŒã¿ãèªã¿åããŸãã ãã®äŸã§ã¯ã
running
ãã©ã°ã䜿çšãããŠããŸããããã¯ãå¥ã®ã¹ã¬ãããã圱é¿ãåããå¯èœæ§ãããã°ããŒãã«å€æ°ã§ãã ããšãã°ããã®ãããªå€æ°ã䜿çšãããšã[åæ¢]ãã¿ã³ã䜿çšããŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¹ããªãŒã ããã®ãµãŠã³ãã®ãã£ããã£ãåæ¢ã§ããŸãã
OutputStream out = new ByteArrayOutputStream(); running = true; try { while (running) { int count = line.read(buffer, 0, buffer.length); if (count > 0) { out.write(buffer, 0, count); } } out.close(); } catch (IOException e) { System.err.println("I/O problems: " + e); System.exit(-1); }
æéããã³åšæ³¢æ°é å
é
åã«ã¯ã
æéé åã®é³å£°ä¿¡å·ã®ããžã¿ã«è¡šçŸãå«ãŸããŠ
ããŸã ã ã€ãŸããä¿¡å·ã®æ¯å¹
ãæéãšãšãã«ã©ã®ããã«å€åãããã«ã€ããŠã®æ
å ±ããããŸãã
19äžçŽã«ããžã£ã³ãããã£ã¹ããžã§ã»ãããŒãªãšã¯çŽ æŽãããçºèŠãããŸããã ããã¯ãåæ£åŒŠæ³¢ãç¹å®ã®åšæ³¢æ°ãæ¯å¹
ãäœçžãæã£ãŠããå Žåãæéé åã®ä¿¡å·ã¯ç¹å®ã®æ°ïŒããããç¡éïŒã®åçŽãªæ£åŒŠæ³¢ä¿¡å·ã®åèšã«çãããšããäºå®ããæããŸãã å
ã®ä¿¡å·ã圢æããæ£åŒŠæ³¢ã®ã»ããã¯ã
ããŒãªãšçŽæ°ãšåŒã°ããŸãã
ã€ãŸãããã®ä¿¡å·ã圢æããåæ£åŒŠæ³¢ã«å¯Ÿå¿ããåšæ³¢æ°ãæ¯å¹
ãäœçžã®ã»ãããèšå®ããã ãã§ãã»ãŒãã¹ãŠã®ä¿¡å·ãæéå
ã«å±éãããããšãæ³åã§ããŸãã ãã®ãããªä¿¡å·ã®è¡šçŸã¯
ãåšæ³¢æ°ééã®ã»ãããšåŒã°ã
ãŸã ã ããæå³ã§ã¯ãåšæ³¢æ°ééã«é¢ããæ
å ±ã¯ããæçŽããŸãã¯æéã®çµéãšãšãã«å±éãããä¿¡å·ã·ã°ããã£ã®ãããªãã®ã§ãããåçããŒã¿ã®éçãªè¡šçŸãæäŸããŸãã
æéå
ã«å±éãããä¿¡å·ãšãã®åšæ³¢æ°ç¹æ§1 Hzã®
æ¹åœ¢æ³¢ã«å¯ŸããããŒãªãšçŽæ°ã®ã¢ãã¡ãŒã·ã§ã³è¡šçŸã¯æ¬¡ã®ããã«ãªããŸãã ãŸããäžé£ã®æ£åŒŠæ³¢ã«åºã¥ãå
ã®ä¿¡å·ã®è¿äŒŒã瀺ããŠããŸãã äžã®ã°ã©ãã§ã¯ãä¿¡å·ã¯æ¯å¹
æéé åã§è¡šç€ºãããäžã®ã°ã©ãã§ã¯ãæ¯å¹
åšæ³¢æ°åœ¢åŒã§è¡šç€ºãããŸãã
ããŒãªãšå€æã®åäœã åºå
žïŒ Rene Schwarzä¿¡å·ã®åšæ³¢æ°ç¹æ§ãåæãããšãå€ãã®åé¡ã®è§£æ±ºã倧å¹
ã«ä¿é²ãããŸãã ããžã¿ã«ä¿¡å·åŠçã®åéã§ãã®ãããªç¹æ§ã§åäœããããšã¯éåžžã«äŸ¿å©ã§ãã ãããã䜿çšãããšãä¿¡å·ã®ã¹ãã¯ãã«ïŒãã®åšæ³¢æ°ç¹æ§ïŒã調ã¹ããã®ä¿¡å·ã®ã©ã®åšæ³¢æ°ãã©ã®åšæ³¢æ°ã§ããããå€æã§ããŸãã ãã®åŸãç¹å®ã®åšæ³¢æ°ããã£ã«ã¿ãªã³ã°ãå¢å¹
ããŸãã¯æžè¡°ããããæ¢åã®åšæ³¢æ°ã»ããã®äžã§ç¹å®ã®é«ãã®é³ãåã«èªèããããšãã§ããŸãã
é¢æ£ããŒãªãšå€æ
ãã®ãããæéå
ã«å±éãããä¿¡å·ã®åšæ³¢æ°ç¹æ§ãååŸããæ¹æ³ãèŠã€ããå¿
èŠããããŸãã ããã«ã¯
é¢æ£ããŒãªãšå€æ ïŒDFTãDFTãé¢æ£ããŒãªãšå€æïŒã圹ç«ã¡ãŸãã DFTã¯ãé¢æ£ä¿¡å·ã®
ããŒãªãšè§£æã®æ°åŠçææ³
ã§ã ã ããã䜿çšããŠãçééã§ååŸããä¿¡å·ãµã³ãã«ã®æéã»ãããããããã®æ£åŒŠæ³¢ãåãåšæ³¢æ°ã§é¢æ£åãããããšãèæ
®ããŠãåšæ³¢æ°ã§é åºä»ããããè€çŽ æ£åŒŠæ³¢ã®æéçµã¿åããã®ä¿æ°ã®ãªã¹ãã«å€æã§ããŸãã
DFTãèšç®ããããã®æãäžè¬çãªæ°å€ã¢ã«ãŽãªãºã ã®1ã€ã¯ã
é«éããŒãªãšå€æ ïŒFFTãFFTãé«éããŒãªãšå€æïŒãšåŒã°ããŸãã å®éãFFTã¯äžé£ã®ã¢ã«ãŽãªãºã å
šäœã§è¡šãããŸãã ãã®äžã§ãã
ã¢ã«ãŽãªãºã ã®Cooley-Tukeyããªã¢ã³ããæããã䜿çšãããŸãã ãã®ã¢ã«ãŽãªãºã ã®åºç€ã¯ããåå²ããŠåŸæããããšããååã§ãã èšç®äžãå
ã®DFTã®å°ããªéšåãžã®ååž°çå解ã䜿çšãããŸãã ç¹å®ã®ããŒã¿ã»ãã
nã®DFTãçŽæ¥èšç®ããã«ã¯ã
OïŒn 2 ïŒæäœãå¿
èŠã§ããCooley-Tukeyã¢ã«ãŽãªãºã ã䜿çšãããšã
OïŒn log nïŒæäœã®åãåé¡ã解決ã§ã
ãŸã ã
FFTã¢ã«ãŽãªãºã ãå®è£
ããé©åãªã©ã€ãã©ãªãèŠã€ããã®ã¯ç°¡åã§ãã ããŸããŸãªèšèªçšã®ãããã®ã©ã€ãã©ãªã®äžéšã次ã«ç€ºããŸãã
Javaã§èšè¿°ãããFFTãèšç®ããããã®é¢æ°ã®äŸã次ã«ç€ºããŸãã è€çŽ æ°ãå
¥åã«éãããŸãã è€çŽ æ°ãšäžè§é¢æ°ã®é¢ä¿ãç解ããããã«
ããªã€ã©ãŒã®å
¬åŒã«ã€ããŠèªããšäŸ¿å©ã§ãã
public static Complex[] fft(Complex[] x) { int N = x.length; // fft Complex[] even = new Complex[N / 2]; for (int k = 0; k < N / 2; k++) { even[k] = x[2 * k]; } Complex[] q = fft(even); // fft Complex[] odd = even; // for (int k = 0; k < N / 2; k++) { odd[k] = x[2 * k + 1]; } Complex[] r = fft(odd); // Complex[] y = new Complex[N]; for (int k = 0; k < N / 2; k++) { double kth = -2 * k * Math.PI / N; Complex wk = new Complex(Math.cos(kth), Math.sin(kth)); y[k] = q[k].plus(wk.times(r[k])); y[k + N / 2] = q[k].minus(wk.times(r[k])); } return y; }
FFTåæã®ååŸã®ä¿¡å·ã®äŸã次ã«ç€ºããŸãã
FFTåæã®ååŸã®ä¿¡å·é³æ¥œèªèïŒæ²ã®çœ²å
FFTã®äžå¿«ãªå¯äœçšã®1ã€ã¯ãåæåŸãæéæ
å ±ã倱ãããããšã§ãã ïŒãã ããçè«çã«ã¯ãããåé¿ã§ããŸãããå®éã«ã¯éåžžã«å€§ããªåŠçèœåãå¿
èŠã«ãªããŸããïŒããšãã°ã3åéã®æã®å Žåãé³ã®åšæ³¢æ°ãšãã®æ¯å¹
ãèŠãããšãã§ããŸããããããã®åšæ³¢æ°ãäœåã®ã©ãã«çŸãããã¯ããããŸããã ãããŠãããã¯é³æ¥œããããäœã§ããããäœãæãéèŠãªç¹æ§ã§ãïŒ ååšæ³¢æ°ãçŸããæéã®æ£ç¢ºãªå€ãäœããã®æ¹æ³ã§èŠã€ããå¿
èŠããããŸãã
ãã®ãããã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠãããŒã¿ãããã¯ã®ãããªãã®ã䜿çšãããã®ããŠã£ã³ããŠãã«å
¥ãä¿¡å·ã®éšåã®ã¿ãå€æããŸãã åãããã¯ã®ãµã€ãºã¯ãããŸããŸãªã¢ãããŒãã䜿çšããŠæ±ºå®ã§ããŸãã ããšãã°ã16ãããã®ãµã³ãã«ãµã€ãºã§44100 Hzã®ãµã³ããªã³ã°åšæ³¢æ°ã§2ãã£ã³ãã«ã®ãµãŠã³ããé²é³ãããšããã®ãããªãµãŠã³ãã®1ç§ã¯176 KBã®ã¡ã¢ãªãå æããŸãïŒ44100ãµã³ãã«* 2ãã€ã* 2ãã£ã³ãã«ïŒã ã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠã®ãµã€ãºã4 KBã«èšå®ããå Žåã1ç§ããšã«44åã®ããŒã¿ãããã¯ãåæããå¿
èŠããããŸãã ããã¯ãæ§æã®è©³çŽ°ãªåæã®ããã®ããªãé«ã解å床ã§ãã
ããã°ã©ãã³ã°ã«æ»ããŸãããã
byte audio [] = out.toByteArray() int totalSize = audio.length int sampledChunkSize = totalSize/chunkSize; Complex[][] result = ComplexMatrix[sampledChunkSize][]; for(int j = 0;i < sampledChunkSize; j++) { Complex[chunkSize] complexArray; for(int i = 0; i < chunkSize; i++) { complexArray[i] = Complex(audio[(j*chunkSize)+i], 0); } result[j] = FFT.fft(complexArray); }
å
åŽã®ã«ãŒãã§ã¯ãæéé åã®ããŒã¿ïŒãµãŠã³ããµã³ãã«ïŒãèæ°éšã0ã®è€çŽ æ°ã«å
¥ããŸããå€åŽã®ã«ãŒãã§ã¯ããã¹ãŠã®ããŒã¿ãããã¯ã調ã¹ãŠãããããã®FFTåæãéå§ããŸãã
ä¿¡å·ã®åšæ³¢æ°ç¹æ§ã«é¢ããæ
å ±ãåŸããããšããã«ãé³æ¥œäœåã®ããžã¿ã«çœ²åã®äœæã«é²ãããšãã§ããŸãã ããã¯ãShazamãå®è£
ããé³æ¥œèªèããã»ã¹å
šäœã®äžã§æãéèŠãªéšåã§ãã ããã§ã®äž»ãªå°é£ã¯ãéåžžã«éèŠãªåšæ³¢æ°ãèšå€§ãªæ°ããéžæããããšã§ãã çŽç²ã«çŽæçã«ãæ倧æ¯å¹
ã®åšæ³¢æ°ïŒéåžžããŒã¯ãšåŒã°ããŸãïŒã«æ³šæãæããŸãã
ãã ããããæ²ã§ã¯ãã匷ããåšæ³¢æ°ã®ç¯å²ã¯ããé³ãããã³ã³ããã¯ã¿ãŒãïŒ32.70 HzïŒé³ãŸã§ã5ãªã¯ã¿ãŒãïŒ4186.01 HzïŒé³ãŸã§å€åããŸãã ããã¯å€§ããªééã§ãã ãããã£ãŠãåšæ³¢æ°ç¯å²å
šäœãããã«åæãã代ããã«ãããã€ãã®å°ããééãéžæã§ããŸãã éåžžãéèŠãªé³æ¥œã³ã³ããŒãã³ãã«åºæã®åšæ³¢æ°ã«åºã¥ããŠéžæããããããåå¥ã«åæã§ããŸãã ããšãã°ã
ãã®ããã°ã©ããShazamã¢ã«ãŽãªãºã ã®å®è£
ã«äœ¿çšããééã䜿çšã§ããŸãã ã€ãŸãããããã¯äœé³çšã®30 Hzã40 Hzã40 Hzã80 Hzãããã³80 Hzã120 Hzã§ãïŒããã«ã¯ãããšãã°ããŒã¹ã®ã¿ãŒãå«ãŸããŸãïŒã äžé³ä»¥äžã®é³ã«ã¯ã120 Hzã180 Hzããã³180 Hzã300 Hzã®åšæ³¢æ°ã䜿çšãããŸãïŒããã«ã¯ãããŒã«ã«ãä»ã®ã»ãšãã©ã®æ¥œåšãå«ãŸããŸãïŒã
ééã決å®ããã®ã§ãæé«ã¬ãã«ã®ééãç°¡åã«èŠã€ããããšãã§ããŸãã ãã®æ
å ±ã¯ãåæãããŠããç¹å®ã®ããŒã¿ãããã¯ã®çœ²åã圢æããæ²å
šäœã®çœ²åã®äžéšã§ãã
public final int[] RANGE = new int[] { 40, 80, 120, 180, 300 }; // , public int getIndex(int freq) { int i = 0; while (RANGE[i] < freq) i++; return i; } // â , for (int t = 0; t < result.length; t++) { for (int freq = 40; freq < 300 ; freq++) { // : double mag = Math.log(results[t][freq].abs() + 1); // , : int index = getIndex(freq); // : if (mag > highscores[t][index]) { points[t][index] = freq; } } // - long h = hash(points[t][0], points[t][1], points[t][2], points[t][3]); } private static final int FUZ_FACTOR = 2; private long hash(long p1, long p2, long p3, long p4) { return (p4 - (p4 % FUZ_FACTOR)) * 100000000 + (p3 - (p3 % FUZ_FACTOR)) * 100000 + (p2 - (p2 % FUZ_FACTOR)) * 100 + (p1 - (p1 % FUZ_FACTOR)); }
é²é³ã¯çæ³çãªæ¡ä»¶äžïŒã€ãŸããé²é³å®€ã§ã¯ãªãïŒã§è¡ããããã®ã§ã¯ãªãããšã«æ³šæããŠãã ããã ãã®çµæãéšå±ã®ç¹æ§ã«å¿ããŠãé²é³ã«å€æ¥ãã€ãºãååšããé²é³ãããé³ã«æªã¿ãçããå¯èœæ§ããããŸãã ãã®åé¡ã¯éåžžã«çå£ã«åãçµãå¿
èŠããããŸããå®éã®ã·ã¹ãã ã§ã¯ãé²é³ãå®è¡ãããæ¡ä»¶ã«å¿ããŠãçºçããå¯èœæ§ã®ããæªã¿ãšå€æ¥é³ïŒãã¡ãºãã¡ã¯ã¿ãŒïŒã®åæã®ãã¥ãŒãã³ã°ãå®è£
ãã䟡å€ããããŸãã
楜æ²ã®æ€çŽ¢ãç°¡åã«ããããã«ããããã®çœ²åã¯ããã·ã¥ããŒãã«ã®ããŒãšããŠäœ¿çšãããŸãã ããŒã¯ã眲åãèŠã€ãã£ãåšæ³¢æ°ã®ã»ãããäœåã«çŸãããšãã®æéå€ãšãäœåèªäœã®èå¥åïŒæ²åãã¢ãŒãã£ã¹ãåãªã©ïŒã«å¯Ÿå¿ããŸãã ãã®ãããªã¬ã³ãŒããããŒã¿ããŒã¹ã§ã©ã®ããã«èŠãããã®ãªãã·ã§ã³ã次ã«ç€ºããŸãã
ããã·ã¥ã¿ã°
| ç§åäœã®æé
| æ
|
30 51 99 121 195
| 53.52
| æA by A
|
33 56 92 151185
| 12.32
| æB by B
|
39 26 89141251
| 15.34
| æC by C
|
32 67100128270
| 78.43
| æD by D
|
30 51 99 121 195
| 10.89
| ãœã³ã°E by E
|
34 57 95111200
| 54.52
| æA by A
|
34 41 93161202
| 11.89
| ãœã³ã°E by E
|
ãã®æ¹æ³ã§ç¹å®ã®é³æ¥œã¬ã³ãŒãã®ã©ã€ãã©ãªãåŠçããå Žåãåæ²ã®å®å
šãªçœ²åãå«ãããŒã¿ããŒã¹ãæ§ç¯ã§ããŸãã
äžèŽãæ€çŽ¢
ã¬ã¹ãã©ã³ã§çŸåšåçãããŠããæ²ã確èªããã«ã¯ãé»è©±ã䜿çšããŠé³å£°ãé²é³ããäžèšã®çœ²åèšç®ããã»ã¹ãå®è¡ããå¿
èŠããããŸãã ãã®åŸãããŒã¿ããŒã¹å
ã®èšç®ãããããã·ã¥ã¿ã°ã®æ€çŽ¢ãéå§ã§ããŸãã
ããããããã»ã©åçŽã§ã¯ãããŸããã äºå®ãç°ãªãäœåã®å€ãã®æçã«ã€ããŠãããã·ã¥ã¿ã°ãäžèŽãããšããããšã§ãã ããšãã°ãæ²Aã®äžéšãæ²Eã®ç¹å®ã®ã»ã¯ã·ã§ã³ãšãŸã£ããåãããã«èãããããšãå€æããå ŽåããããŸãã ãã¥ãŒãžã·ã£ã³ãšäœæ²å®¶ã¯ãåžžã«ãäºãããæåããæ²ããåããŠããŸããã
äžèŽããããã·ã¥ã¿ã°ãèŠã€ããããšãã§ãããšãã¯ãã€ã§ããäžèŽããå¯èœæ§ã®ããæ°ã¯æžå°ããŸããããã®æ
å ±ã ãã§ã¯ãæ£ããæ²ã ãã§åæ¢ããã»ã©æ€çŽ¢ç¯å²ãçããããšã¯ã§ããŸããã ãããã£ãŠãé³æ¥œèªèã¢ã«ãŽãªãºã ã§ä»ã®äœãããã§ãã¯ããå¿
èŠããããŸãã ã€ãŸããã¿ã€ã ã¹ã¿ã³ãã«ã€ããŠè©±ããŠããŸãã
ã¬ã¹ãã©ã³ã§é²é³ãããæã®æçã¯ããã®å Žæã®ããããããã®ãã®ã§ããå¯èœæ§ããããããèšé²ãããæçå
ã®çžå¯ŸæéãããŒã¿ããŒã¹å
ã®ãã®ãšçŽæ¥æ¯èŒããããšã¯ã§ããŸããã
ãã ããè€æ°ã®äžèŽãèŠã€ãã£ãå ŽåãäžèŽã®çžå¯Ÿçãªã¿ã€ãã³ã°ãåæã§ãããããæ€çŽ¢ã®ä¿¡é Œæ§ãåäžããŸãã
ããšãã°ãäžã®è¡šãèŠããšãããã·ã¥ã¿ã°30 51 99 121 195ãæ²Aãšæ²Eã®äž¡æ¹ã«é©çšãããŠããããšãããããŸããããã·ã¥ã¿ã°34 57 95 111 200ã1ç§åŸã«ãã§ãã¯ãããšãå¥ã®ããã«ãæ²AãšäžèŽããå Žåãåæ§ã®å Žåãããã·ã¥ã¿ã°ãšãã®æéååžãäžèŽããããšãããããŸãã
// , private class DataPoint { private int time; private int songId; public DataPoint(int songId, int time) { this.songId = songId; this.time = time; } public int getTime() { return time; } public int getSongId() { return songId; } }
i1ãš
i2ãé²é³ãããæ²ã®ã¿ã€ã ã¹ã¿ã³ãã
j1ãš
j2ãããŒã¿ããŒã¹ã®æ²ã®ã¿ã€ã
ã¹ã¿ã³ããšããŸãã 次ã®æ¡ä»¶ãæºããããå Žåãæéå·®ã®äžèŽãèæ
®ããŠã2ã€ã®äžèŽããããšèšããŸãã
RecordedHash(i1) = SongInDBHash(j1) AND RecordedHash(i2) = SongInDBHash(j2) AND abs(i1 - i2) = abs (j1 - j2)
ããã«ãããã¬ã³ãŒãã®æåãäžéããŸãã¯æåŸã§ã¬ã³ãŒãã®ã©ã®éšåã«è©²åœãããå¿é
ããå¿
èŠããªããªããŸãã
ãããŠæåŸã«ããéçãã®æ¡ä»¶ã§é²é³ãããæ²ã®ååŠçæžã¿ãã©ã°ã¡ã³ãããã¹ã¿ãžãªé²é³ã«åºã¥ããŠæ§ç¯ãããããŒã¿ããŒã¹ã®é¡äŒŒãã©ã°ã¡ã³ããšäžèŽããããšã¯ã»ãšãã©ãããŸããã ç§ãã¡ãäœåã®ååãèŠã€ããããšæãèšé²ã«ã¯ãå€ãã®ãã€ãºãå«ãŸããŠããããããæ¯èŒã®ããã€ãã®ççŸã«ã€ãªãããŸãã ãã®ãããããŒã¿ããŒã¹ãšã®ç
§åæé ã®æåŸã«ãæ£ããæ§æã®ã¿ãé€ããŠãäžèŽã®ãªã¹ããããã¹ãŠãé€å€ããããšãã代ããã«ãäžèŽããã¬ã³ãŒãããœãŒãããŸãã éé ã«äžŠã¹æ¿ããŸãã å¶ç¶ã®äžèŽãå€ããã°å€ãã»ã©ãæ£ããéãèŠã€ããå¯èœæ§ãé«ããªããŸãã ãããã£ãŠã圌女ã¯ãªã¹ãã®äžçªäžã«ãªããŸãã
é³æ¥œèªèã®æŠèŠ
以äžã«ãé³æ¥œèªèæé å
šäœã®æŠèŠã瀺ããŸãã ç§ãã¡ã¯æåããæåŸãŸã§ãããæ©ããŸãã
é³æ¥œèªèã®æŠèŠããã¯ãã¹ãŠå
ã®é³ããå§ãŸããŸãã 次ã«ããã£ããã£ãããåšæ³¢ââæ°ç¹æ§ãæ€åºãããããã·ã¥ã¿ã°ãèšç®ãããé³æ¥œããŒã¿ããŒã¹ã«ä¿åãããŠããã¿ã°ãšæ¯èŒãããŸãã
ãã®ãããªã·ã¹ãã ã§ã¯ãããŒã¿ããŒã¹ã巚倧ã«ãªãå¯èœæ§ããããããã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ã䜿çšããããšãéèŠã§ãã ããŒã¿ããŒã¹ããŒãã«ã®é¢ä¿ã¯ç¹ã«å¿
èŠãããŸãããããŒã¿ã¢ãã«ã¯éåžžã«åçŽãªã®ã§ãããã§ã¯äœããã®çš®é¡ã®NoSQLããŒã¿ããŒã¹ãé©ããŠããŸãã
ã·ã£ã¶ã ïŒ
ããã§ã話ããããããªããã°ã©ã ã¯ãé³æ¥œäœåã®åæ§ã®å ŽæãèŠã€ããã®ã«é©ããŠããŸãã Shazamã®ä»çµã¿ãç解ã§ããã®ã§ãé³æ¥œèªèã¢ã«ãŽãªãºã ã¯ãã¿ã¯ã·ãŒã§ã©ãžãªã§æŒå¥ããããéå»ã®å¿ããããæ²ã®ååã®ããªãã€ã³ããŒããšããŠã ãã§ãªãé©çšå¯èœã§ããããšãããããŸãã
ããšãã°ã圌ãã®å©ããåããŠãé³æ¥œã®çäœãæ€çŽ¢ãããããã«ãŒã¹ããžã£ãºãããã¯ãã¥ãŒãžãã¯ãããããã¥ãŒãžãã¯ããã®ä»ã®ãžã£ã³ã«ã®å
é§è
ã«åœ±é¿ãäžããã¢ãŒãã£ã¹ããèŠã€ããããšãã§ããŸãã
ãããããããããããŒããŒãŽã§ã³ããŽã£ãŽã¡ã«ãã£ãã¯ãŒã°ããŒãã·ã§ãã³ãã¢ãŒãã¡ã«ãã®äœåãªã©ã®å€å
žãããŒã¿ããŒã¹ã«å
¥åãããããã®äœåã§äŒŒããããªãã®ãèŠã€ããããšã¯è¯ãå®éšã§ãããã ã ãããããã»ãã£ã©ã³ããšã«ãã¹ã»ãã¬ã¹ãªãŒããããŒãã»ãžã§ã³ãœã³ã§ãããä»ã®äººããäœããåããããšãå«ãã£ãŠããªãã£ããšç¥ãããšã¯ããªãå¯èœã§ãïŒ
ããããç§ãã¡ã¯ãããã責ããããšãã§ããŸããïŒ ãã£ãšéããŸãã çµå±ã®ãšãããé³æ¥œã¯äººã®é ã®äžã§èãããèšæ¶ããç¹°ãè¿ãé³ã«éããŸããã ããã§éçºãããå€æŽãããŸã-ã¹ã¿ãžãªã§é²é³ãããéçã«ãªãªãŒã¹ããããŸã§ãé³æ¥œããå¥ã®å€©æãéŒèããå¯èœæ§ããããŸãã
ãããä»äºã«æ¥ãŠãããŸãããïŒ :)wunderfund.ioã¯ã
é«é »åºŠã¢ã«ãŽãªãºã ååŒãæ±ãè¥ã財å£ã§ãã é«é »åºŠååŒã¯ãäžçäžã®æé«ã®ããã°ã©ããŒãšæ°åŠè
ã«ããç¶ç¶çãªç«¶äºã§ãã ç§ãã¡ã«åå ããããšã§ãããªãã¯ãã®é
åçãªæŠãã®äžéšã«ãªããŸãã
ç±å¿ãªç 究è
ãããã°ã©ããŒåãã«ãèå³æ·±ãè€éãªããŒã¿åæãšäœé
延ã®éçºã¿ã¹ã¯ãæäŸããŠããŸãã
æè»ãªã¹ã±ãžã¥ãŒã«ãšå®å䞻矩ããªããããææ決å®ãè¿
éã«è¡ãããå®æœãããŸãã
ããŒã ã«åå ïŒ
wunderfund.io