{"id":3590,"date":"2009-10-09T20:31:00","date_gmt":"2009-10-09T11:31:00","guid":{"rendered":"http:\/\/leavebehind.iobb.net\/wordpress\/?p=3590"},"modified":"2020-11-26T14:07:29","modified_gmt":"2020-11-26T05:07:29","slug":"%e3%81%a8%e3%81%a9%e3%81%93%e3%81%8a%e3%82%8bfft","status":"publish","type":"post","link":"http:\/\/leavebehind.mydns.jp\/wordpress\/2009\/10\/09\/%e3%81%a8%e3%81%a9%e3%81%93%e3%81%8a%e3%82%8bfft\/","title":{"rendered":"\u3068\u3069\u3053\u304a\u308bFFT"},"content":{"rendered":"<p>\u9813\u632b\u4e2d\u3002\u50d5\u306e\u8abf\u3079\u65b9\u304c\u60aa\u3044\u306e\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001FFT\u3068\u306f\u7121\u95a2\u4fc2\u306a\u3068\u3053\u308d\u3067\u60a9\u307f\u4e2d\u3002\u4eca\u65e5\u306f\u6587\u5b57\u3060\u3089\u3051\u3067\u3059\u3093\u307e\u305b\u3093\u3002<\/p>\n<p><strong>\u30d7\u30ec\u30a4\u30d0\u30c3\u30af\u306e\u554f\u984c<\/strong><br \/>\n\u30e9\u30a4\u30d6\u30e9\u30ea\u300cminim\u300d\u306fFFT\u304c\u7c21\u5358\u306b\u51fa\u6765\u308b\u3082\u306e\u306e\u3001\u554f\u984c\u306f\u30d7\u30ec\u30a4\u30d0\u30c3\u30af\u90e8\u5206\u3001\u7279\u306b\u518d\u751f\u7d42\u4e86\u30a4\u30d9\u30f3\u30c8\u3092\u53d7\u3051\u53d6\u308c\u306a\u3044(&rarr;<a href=\"http:\/\/\">[Minim] Tell if an AudioPlayer finishes playing?<\/a>)\u3002minim\u306e\u4f5c\u8005\u3055\u3093\u672c\u4eba\u304c\u8fd4\u4e8b\u3092\u3057\u3066\u307e\u3059\u304c\u5148\u306e10\u6708\u306b\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u305f\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u3082\u6539\u5584\u304c\u7121\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u518d\u751f\u306f\u52dd\u624b\u306b\u6b62\u307e\u308b\u306e\u3067\u3044\u3044\u3093\u3067\u3059\u3001\u3067\u3082\u305d\u306e\u5f8c\u3001\u5404GUI\u3092\u521d\u671f\u72b6\u614b\u306b\u623b\u3057\u305f\u308a\u3001\u3082\u308d\u3082\u308d\u306e\u5f8c\u51e6\u7406\u304c\u51fa\u6765\u306a\u3044\u3068\u3059\u3054\u304f\u6c17\u5206\u306e\u60aa\u3044\u30c4\u30fc\u30eb\u304c\u3067\u304d\u3042\u304c\u308b\u306e\u304c\u30a4\u30e4\u3002<\/p>\n<p>\u540c\u3058\u6a5f\u80fd\u3092\u6301\u3064\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u300cEss\u300d\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u3053\u3061\u3089\u306fFFT\u306e\u7d50\u679c\u3092\u30ea\u30cb\u30a2\u3067\u51fa\u3057\u3066\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\u30d9\u30fc\u30b9\u309222Hz\u3068\u3057\u3066220Hz\u30012,200Hz\u3001\u3001\u300122&#215;10<sup>n<\/sup>\u306e\u7d50\u679c\u3092\u5f97\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u305b\u3093\u3002\u805e\u304d\u53d6\u308c\u306a\u3044\u9ad8\u5468\u6ce2\u6210\u5206\u306e\u7d50\u679c\u3092\u305f\u304f\u3055\u3093\u51fa\u3055\u308c\u305f\u3068\u3053\u308d\u3067\u3001\u306d\u3047\u3002<br \/>\n\u518d\u751f\u7d42\u4e86\u6642\u306e\u51e6\u7406\u306f\u30e1\u30bd\u30c3\u30c9audioChannelDone(AudioChannel)\u3092\u4e0a\u66f8\u304d\u3059\u308c\u3070\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>\u89e3\u6c7a\u3059\u308b\u306b\u306fEss\u3092\u30d7\u30ec\u30a4\u30d0\u30c3\u30af\u7528\u3001\u518d\u751f\u4e2d\u306e\u30b5\u30a6\u30f3\u30c9\u30d0\u30c3\u30d5\u30a1\u3092minim.FFT\u3078\u3001\u3063\u3066\u5408\u308f\u305b\u6280\u304b\u306a\uff1f\u3002<\/p>\n<p><strong>GUI\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u3053\u3068<\/strong><br \/>\nGUI\u306b\u4f7f\u7528\u3057\u3066\u3044\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u300ccontrolP5\u300d\u3082\u4e0d\u8db3\u304c\u3042\u308b\u305b\u3044\u304b\u30de\u30a6\u30b9\u306e\u5404\u72b6\u614b\u3092\u5f97\u308b\u3053\u3068\u304c\u51fa\u6765\u306a\u3044\u3067\u3044\u307e\u3059\u3002\u30ec\u30dd\u30b8\u30c8\u30ea\u4e0a\u306e\u958b\u767a\u9014\u4e0a\u306a0.40\u306e\u30bd\u30fc\u30b9(Controller.java)\u3092\u898b\u308b\u3068\u3001isMousePressed()\u3067\u30de\u30a6\u30b9\u306e\u72b6\u614b\u3092\u53d6\u5f97\u3067\u304d\u305f\u308a\u3001mousePressed() \u3001mouseReleased()\u7b49\u306e\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u53ef\u80fd\u306a\u30e1\u30bd\u30c3\u30c9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002\u3067\u3082\u30b3\u30f3\u30d1\u30a4\u30eb\u3063\u3066\u3069\u3046\u3059\u308b\u3093\u3060\uff1f<\/p>\n<p><strong>\u3063\u3066\u4e8b\u3067<\/strong><br \/>\nProsessing\u4ee5\u5916\u3067\u3082\u5b9f\u73fe\u3067\u304d\u308b\u3082\u306e\u304c\u7121\u3044\u304b\u8abf\u3079\u4e2d\u3002<br \/>\nActionScript3\u306b\u3082\u300cSoundMixer.computeSpectrum () \u300d\u3063\u3066\u306e\u304c\u3042\u308a\u307e\u3059\u306d\u3002<br \/>\n\u3042\u3068\u306f\u3001<a href=\"http:\/\/puredata.info\/\">PureData<\/a>\u3068\u304b\u3001<a href=\"http:\/\/vvvv.org\/\">vvvv<\/a>\u3068\u304b\u3001\u3001\u3001<br \/>\nMacOSX\u306eQuartzComposer\u3067\u3082\u3067\u304d\u308b\u3093\u3067\u3059\u304c\u3001\u30c7\u30fc\u30bf\u306e\u66f8\u304d\u51fa\u3057\u90e8\u5206\u3092Objective-C\u3067\u66f8\u304b\u306a\u304d\u3083\u3044\u3051\u306a\u3044\u306e\u306f\u3061\u3087\u3063\u3068\u3001\u3001\u3001<\/p>\n<p>\u7d9a\u304d\u306f\u9813\u632b\u4e2d\u306e\u300c\u898b\u3061\u3083\u3044\u3084\u3093\u30d0\u30fc\u30b8\u30e7\u30f3\u300d\u306e\u30bd\u30fc\u30b9\u3067\u3059\u3002\u4ee5\u4e0a\u306e\u7d4c\u7def\u304c\u3042\u3063\u3066\u307e\u3060\u4e00\u756a\u809d\u5fc3\u306a\u30c7\u30fc\u30bf\u66f8\u304d\u51fa\u3057\u7b49\u306f\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u3059\u3054\u304f\u4e2d\u9014\u534a\u7aef\u306a\u306e\u3067\u5f79\u306b\u306f\u7acb\u305f\u306a\u3044\u3067\u3059\u3088\u3002<\/p>\n<p>Minim\u306f\u6a19\u6e96\u3067\u5165\u3063\u3066\u3044\u307e\u3059\u304c\u3001\u307b\u304b\u306b<a href=\"http:\/\/www.sojamo.de\/controlP5\">controlP5<\/a>\u304c\u5fc5\u8981\u3067\u3059\u3002<br \/>\nmp3,AIFF,wav\u3092\u958b\u3044\u3066\u518d\u751f\u3068\u30b9\u30da\u30af\u30c8\u30eb\u306e\u8868\u793a\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u4f5c\u308b\u306e\u304c\u6700\u7d42\u76ee\u7684\u3058\u3083\u306a\u304f\u3063\u3066\u3001\u3053\u308c\u4f7f\u3063\u3066\u6620\u50cf\u3092\u4f5c\u308a\u305f\u3044\u3093\u3067\u3059\u3051\u3069\u3049\uff01<br \/>\n<!--more--><\/p>\n<pre>\/* minim.FFT test\nFollowing code is WORK IN PROGRESS.\nRequired Libraries: controlP5 and Minim\n*\/\n\nimport controlP5.*;\nimport ddf.minim.analysis.*;\nimport ddf.minim.*;\n\nControlP5 gui;\n\ncontrolP5.Button btnOpenFile;\ncontrolP5.Button btnSaveResult;\ncontrolP5.Button btnExit;\n\/\/controlP5.Textlabel feedbackText;\ncontrolP5.Textlabel lbCurrentTimeMovie;\nint currentTimeMovie = 0;\ncontrolP5.Textlabel lbCurrentTimeSound;\nint currenttTimeSound = 0;\n\ncontrolP5.Button btnStop;\ncontrolP5.Button btnStart;\ncontrolP5.Slider slSeek;\n\nint guiOffset = 10;\nint fileGuiColumn = 5;\nint playbackGuiColumn;\nfloat[] maxHead;\nfloat maxHeadAnimationDelay =  0.95;\n\nMinim minim;\nAudioPlayer audio;\nFFT fftLog;\nint minBandWidth = 22;\nint bandStep = 5;\nint cue = 0;\n\nPGraphics fftScreen;\nint fftScrrenOffsetX = guiOffset;\nint fftScrrenOffsetY = fileGuiColumn + 20;\n\nvoid setup(){\n  size(520,450);\n  background(0);\n  playbackGuiColumn = height - 20;\n  gui = new ControlP5(this);\n  \/\/File GUI\n  btnOpenFile = gui.addButton(\"openFile\",0,guiOffset,fileGuiColumn,100,15);\n  btnOpenFile.setLabel(\"Open Sound File\");\n  btnSaveResult = gui.addButton(\"SatrtAnalaizing\",0,guiOffset + 105,fileGuiColumn,100,15);\n  btnSaveResult.setLabel(\"Start Analaizing\");\n  btnExit = gui.addButton(\"quit\",0,width - 65,fileGuiColumn,60,15);\n  btnExit.setColorBackground(color(128,0,0));\n  btnExit.setColorActive(color(255,0,0));\n\n  \/*\n  ControlP5.standard58\n   ControlP5.standard56\n   ControlP5.synt24\n   ControlP5.grixel \n   *\/\n\n  \/\/PlayBack GUI\n  btnStop = gui.addButton(\"stopAudio\",0,guiOffset,playbackGuiColumn,60,15);\n  btnStop.setLabel(\"Stop\");\n  btnStart = gui.addButton(\"playAudio\",0,guiOffset+65,playbackGuiColumn,60,15);\n  btnStart.setLabel(\"Play\");\n  slSeek = gui.addSlider(\"seekAudio\", 0.0, 100.0, 0.0, guiOffset+130,playbackGuiColumn,250,15);\n  slSeek.setLabelVisible(false);\n\n  \/\/Info\n  lbCurrentTimeMovie = new controlP5.Textlabel(this,\"text\",guiOffset + 5,390,300,15,color(255),ControlP5.grixel);\n  lbCurrentTimeSound = new controlP5.Textlabel(this,\"text\",guiOffset + 5,410,300,15,color(255),ControlP5.grixel);\n\n  disablePlaybackControllers();\n\n  \/\/Setup audio\n  minim = new Minim(this);\n  \/\/minim.debugOn();\n  frameRate(30);\n\n  \/\/Setup Off-screen for FFT Bar-graphs\n  fftScreen = createGraphics(512,300,P2D);\n  fftScreen.beginDraw();\n  fftScreen.background(0);\n  fftScreen.noSmooth();\n  fftScreen.noStroke();\n  fftScreen.endDraw();\n}\n\nvoid draw(){\n  if((audio != null) && (audio.isPlaying())){\n    background(0);\n    slSeek.setValue((float)audio.position() \/ (float)audio.length() * 100.0);\n    updateFftScreen();\n    image(fftScreen,fftScrrenOffsetX,fftScrrenOffsetY);\n    updateRealTimeInfo();\n    currentTimeMovie ++;\n  }\n  else if((audio != null) && (!audio.isPlaying())){\n\n  }\n}\nvoid updateFftScreen(){\n  fftLog.forward(audio.mix);\n  int w = int(fftScreen.width\/fftLog.avgSize());\n  fftScreen.beginDraw();\n  fftScreen.noStroke();\n  fftScreen.background(0);\n  for(int i = 0; i < fftLog.avgSize(); i++){\n    fftScreen.fill(12);\n    fftScreen.rect(i*w + w\/10.0, 0, w\/10.0*8, fftScreen.height);\n    fftScreen.fill(30,30,125);\n    fftScreen.rect(i*w + w\/10.0, fftScreen.height , w\/10.0*8, -1 * fftLog.getAvg(i));\n    fftScreen.fill(0,255,255);\n    maxHead[i] *= 0.95;\n    maxHead[i] = max(maxHead[i],fftLog.getAvg(i));\n    fftScreen.rect(i*w + w\/10.0, fftScreen.height - maxHead[i], w\/10.0*8, 1);\n  }\n  fftScreen.endDraw();\n}\nvoid updateRealTimeInfo(){\n  lbCurrentTimeMovie.setValue(\"Frame (Code domain) : \" + str(currentTimeMovie));\n  lbCurrentTimeMovie.draw(this);\n  lbCurrentTimeSound.setValue(\"Milli-sec. (Playback) : \" + str(audio.position()));\n  lbCurrentTimeSound.draw(this);\n}\nvoid clearState(){\n  for(int i = 0;i< maxHead.length;i++){\n    maxHead[i] = 0.0;\n  }\n  slSeek.setValue(0.0);\n  currentTimeMovie = 0;\n  background(0);\n  updateRealTimeInfo();\n}\nvoid quit(){\n  exit();\n}\nvoid openFile(){\n  String loadPath = selectInput(\"Select sound file\");\n  if(loadPath == null){\n    println(\"No Sound file Selected.\");\n  }\n  else{\n    if(audio != null){\n      audio.pause();\n      audio.close();\n    }\n    println(loadPath);\n    audio = minim.loadFile(loadPath,2048);\n    println(\"Audio Length(milli-sec.):\" + audio.length());\n    \/\/init\n    fftLog = new FFT(audio.bufferSize(),audio.sampleRate());\n    fftLog.logAverages(minBandWidth,bandStep);\n    maxHead = new float[fftLog.avgSize()];\n    for(int i = 0;i< maxHead.length;i++){\n      maxHead[i] = 0.0;\n    }\n  }\n}\nvoid saveResult(){\n}\nvoid enablePlaybackControllers(){ \n}\nvoid disablePlaybackControllers(){\n}\nvoid playAudio(){\n  if((audio != null) &#038;&#038; (!audio.isPlaying())){\n    audio.play(cue);\n    btnStart.setLabel(\"Pause\");\n  }\n  else if((audio != null) &#038;&#038; (audio.isPlaying())){\n    audio.pause();\n    cue = audio.position();\n    btnStart.setLabel(\"Play\");\n  }\n}\nvoid stopAudio(){\n  if(audio != null){\n    audio.rewind();\n    audio.pause();\n    btnStart.setLabel(\"Play\");\n    clearState();\n  }\n}\nvoid seekAudio(){\n  \/*\n  if(mousePressed){\n    if(audio != null){\n      audio.pause();\n      cue = (int)(slSeek.value() \/ 100.0 * audio.length());\n      btnStart.setLabel(\"Play\");\n      println(\"Seek\");\n    }\n  }\n  *\/\n}\nvoid stop(){\n  if(audio != null){\n    audio.close();\n  }\n  minim.stop();\n  super.stop();\n  print(\"exit\");\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u9813\u632b\u4e2d\u3002\u50d5\u306e\u8abf\u3079\u65b9\u304c\u60aa\u3044\u306e\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001FFT\u3068\u306f\u7121\u95a2\u4fc2\u306a\u3068\u3053\u308d\u3067\u60a9\u307f\u4e2d\u3002\u4eca\u65e5\u306f\u6587\u5b57\u3060\u3089\u3051\u3067\u3059\u3093\u307e\u305b\u3093\u3002 \u30d7\u30ec\u30a4\u30d0\u30c3\u30af\u306e\u554f\u984c \u30e9\u30a4\u30d6\u30e9\u30ea\u300cminim\u300d\u306fFFT\u304c\u7c21\u5358\u306b\u51fa\u6765\u308b\u3082\u306e\u306e\u3001\u554f\u984c\u306f\u30d7\u30ec\u30a4\u30d0\u30c3\u30af\u90e8\u5206\u3001\u7279\u306b\u518d\u751f\u7d42\u4e86 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[5,11],"tags":[226],"class_list":["post-3590","post","type-post","status-publish","format-standard","hentry","category-cg","category-proce55ing","tag-processing"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p8YSE4-VU","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/posts\/3590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/comments?post=3590"}],"version-history":[{"count":1,"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/posts\/3590\/revisions"}],"predecessor-version":[{"id":10848,"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/posts\/3590\/revisions\/10848"}],"wp:attachment":[{"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/media?parent=3590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/categories?post=3590"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/leavebehind.mydns.jp\/wordpress\/wp-json\/wp\/v2\/tags?post=3590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}