{"id":25623424,"url":"https://github.com/yu2924/bodeanalyzer","last_synced_at":"2026-02-10T20:31:20.860Z","repository":{"id":165887084,"uuid":"600657742","full_name":"yu2924/BodeAnalyzer","owner":"yu2924","description":"frequency response analyzer application for audio","archived":false,"fork":false,"pushed_at":"2024-11-16T12:13:05.000Z","size":1007,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-14T06:52:22.674Z","etag":null,"topics":["audio-processing","convolution","fft","frequency-analysis","juce-application","measurement","plot","signal-processing"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yu2924.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-12T06:56:32.000Z","updated_at":"2024-11-16T12:13:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"7d7a55d8-816c-48bb-b146-92bbb1f283ff","html_url":"https://github.com/yu2924/BodeAnalyzer","commit_stats":{"total_commits":21,"total_committers":1,"mean_commits":21.0,"dds":0.0,"last_synced_commit":"825a5d5a276c7cebc48659f7df76d3ea53b20f44"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yu2924/BodeAnalyzer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yu2924%2FBodeAnalyzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yu2924%2FBodeAnalyzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yu2924%2FBodeAnalyzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yu2924%2FBodeAnalyzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yu2924","download_url":"https://codeload.github.com/yu2924/BodeAnalyzer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yu2924%2FBodeAnalyzer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29314705,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T17:48:59.043Z","status":"ssl_error","status_checked_at":"2026-02-10T17:45:37.240Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio-processing","convolution","fft","frequency-analysis","juce-application","measurement","plot","signal-processing"],"created_at":"2025-02-22T11:37:59.284Z","updated_at":"2026-02-10T20:31:20.831Z","avatar_url":"https://github.com/yu2924.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BodeAnalyzer\n \n \u003cimg src=\"media/screenshot-ir.png\" width=\"50%\"\u003e\n\n ## What is this?\n\nPCのオーディオインターフェースを利用してオーディオシステムの周波数特性を解析するためのシンプルなツールです。振幅と位相の応答を得るために、2種類の測定方法を用意しています。  \n This is a simple tool for analyzing the frequency response of audio systems using the PC's audio interface. Two measurement methods are available to obtain amplitude and phase responses.  \n\n * IR methods\n    * using pure impulses\n    * using Linear Swept-Sine (OATSP)\n    * using Log Swept-Sine (Pink TSP)\n    * using MLS\n * Stepped Sweep method\n\n Implemented with JUCE.\n\n ## Requirement\n\n* JUCE framework 7.0.4: [download](https://juce.com/get-juce/download), [repository](https://github.com/juce-framework/JUCE)\n* Projucer: [download](https://juce.com/discover/projucer), or build from source\n* C++ build tools: Visual Studio, Xcode, etc.\n* ASIO SDK (optional, Windows only): https://www.steinberg.net/developers/\n\n ## How to build\n\n1. Open the .jucer file with the Projucer.\n2. Correct the JUCE module path and properties, add exporters and save.\n3. Build the generated C++ projects.\n\n## Example\n\n\u003cimg src=\"media/example schematic.svg\" width=\"256\"\u003e\n\u003cimg src=\"media/example hardware.jpg\" width=\"256\"\u003e\n\u003cimg src=\"media/example measurement.png\" width=\"33%\"\u003e\n\n## Written by\n\n[yu2924](https://twitter.com/yu2924)\n\n## License\n\nCC0 1.0 Universal\n\n---\n\n## Appendix\n\n### The Latency Probe\n\n時間の遅れは位相の遅れとして測定されるので、システムの往復レイテンシを正確に把握することは重要です。この機能では、探査信号と応答信号の相互相関関数を求めることによってターゲットシステムを経由した往復レイテンシを特定します。探査信号として非周期的な乱数列を使用します。  \nSince time delay is measured as a phase delay, it is important to determine the precise round-trip latency of the system. This function identifies the round-trip latency through the target system by determining the cross-correlation function between the probe signal and the response signal. An acyclic random number sequence is used as the probe signal.  \n\n\u003cimg src=\"media/diagram-latency_probe.svg\"\u003e  \n\nfig. Latency Probe processing flow diagram\n\n\u003cimg src=\"media/corr-stimulus.png\" width=\"25%\"\u003efig. random number sequence as plobe signal (a)\n\n\u003cimg src=\"media/corr-response.png\" width=\"25%\"\u003efig. delayed and deformed response signal (b)\n\n\u003cimg src=\"media/corr-result.png\" width=\"25%\"\u003efig. obtained correlation function (c)\n\n### The Swept-Sine method\n\nこの手法では、Swept-Sineと呼ばれる刺激信号を使用してターゲットシステムのインパルス応答を求め、それを変換することで周波数応答を得ます。Swept-SineはTSP (time stretched pulse)としても知られています。  \nThis method uses a stimulus signal called the Swept-Sine to obtain the impulse response of the target system, and then transforms it to obtain the frequency response. Swept-Sine is also known as TSP (time stretched pulse).  \n\n\u003cimg src=\"media/diagram-swept_sine.svg\"\u003e  \n\nfig. Swept-Sine Method processing flow diagram\n\ndefinitions:\n\n$$N: \\text{length of the entire stimulus signal}$$\n\n$$m: \\text{the pulse width constant,}\\ \\lt N/2$$\n\n$$H'(n): \\text{conjugate of}\\ H(n)$$\n\n$$j: \\text{imaginary unit,}\\ \\sqrt{-1}$$\n\nLinear Swept-Sine (OATSP):\n\n$$\nH(n)=\n\\begin{cases}\nexp(\\frac{-j 4 m \\pi n^2}{N^2}), \u0026 \\quad 0 \\leq n \\leq N/2\\\\\nH'(N - n), \u0026 \\quad N/2 \u003c n \u003c N, \\text{conjugate symmetric}\\\\\n\\end{cases}\n$$\n\nLog Swept-Sine (Pink TSP):\n\n$$\nH(n)=\n\\begin{cases}\n1, \u0026 \\quad n = 0\\\\\n\\frac{exp(j \\alpha n log(n))}{\\sqrt{n}}, \u0026 \\quad 0 \u003c n \\leq N/2\\\\\nH'(N - n), \u0026 \\quad N/2 \u003c n \u003c N, \\text{conjugate symmetric}\\\\\n\\end{cases}\n$$\n\nwhere\n\n$$\n\\alpha = \\frac{2 m \\pi}{((N / 2) log(N / 2))}\n$$\n\nInverse Function:\n\n$$\nH^{-1}(n) = 1 / H(n)\n$$\n\n\u003cimg src=\"media/tsp-prerotation.png\" width=\"25%\"\u003efig. linear tsp signal generated according to the formula\n\n\u003cimg src=\"media/tsp-postrotation.png\" width=\"25%\"\u003efig. linear tsp signal with rotation applied\n\n\u003cimg src=\"media/ir-prerotation.png\" width=\"25%\"\u003efig. obtained impulse response\n\n\u003cimg src=\"media/ir-postrotation.png\" width=\"25%\"\u003efig. impulse response with rotation applied\n\n### The MLS Method\n\nこの手法では、MLS (maximum length sequence, M系列)を刺激信号に使用してターゲットシステムのインパルス応答を求め、それを変換することで周波数応答を得ます。  \nThis method uses the MLS (maximum length sequence, m-sequence) as the stimulus signal to obtain the impulse response of the target system, and then transforms it to obtain the frequency response.\n\n\u003cimg src=\"media/diagram-mls.svg\"\u003e  \n\nfig. MLS Method processing flow diagram\n\n### The Stepped Sweep Method\n\nこの手法では、一ステップごとに刺激信号の周波数を変化させ、同期検波によって対応する振幅と位相の応答を逐次測定します。古典的な周波数応答の測定方法です。  \n測定速度向上のため、LPFのセトリングタイムを最小化しています。また、ナイキスト周波数近傍の特性を改善するため、オーバーサンプリングを施しています。  \nIn this method, the frequency of the stimulus signal is varied at each step, and the corresponding amplitude and phase responses are measured sequentially by synchronous detection. It is a classical frequency response measurement method.  \nThe settling time of the LPF is minimized to improve the measurement speed. And, Oversampling is applied to improve the characteristics near the Nyquist frequency. \n\n\u003cimg src=\"media/diagram-stepped_sweep.svg\"\u003e  \n\nfig. Stepped Sweep Method processing flow diagram\n\n## Further Development...\n\n現在のところ更なる開発の予定はありませんが、あると良さそうな改良点を追記します。  \nAlthough there are no plans for further development at this time, I add some improvements that would be nice to have.\n\n- Calibration\n\n測定結果は使用したオーディオインターフェースの裸の特性の影響を受けます。これを補正するためにはループバック特性を測定し、その逆関数をキャリブレーション特性とします。  \nMeasurement results are affected by the raw characteristics of the audio interface used. To compensate it, measure the loopback response and use the inverse function of it as calibration characteristics.\n\n\u003cimg src=\"media/audio-loopback.svg\"\u003e  \n\n$$H_{Calib}(z)=\\frac{1}{H_{Loopback}(z)}$$\n\n$$H_{Total}(z)=H_{Measure}(z)*H_{Calib}(z)$$\n\n- Variable plotting range and scale settings\n- Export as PDF\n\netc etc\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyu2924%2Fbodeanalyzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyu2924%2Fbodeanalyzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyu2924%2Fbodeanalyzer/lists"}