{"id":1401,"date":"2025-10-22T13:50:43","date_gmt":"2025-10-22T13:50:43","guid":{"rendered":"https:\/\/smartdata.ece.ufl.edu\/?p=1401"},"modified":"2026-04-07T13:09:22","modified_gmt":"2026-04-07T13:09:22","slug":"one-filter-many-forms-why-dsp-engineers-rebuild-the-same-filter-over-and-over-again","status":"publish","type":"post","link":"https:\/\/smartdata.ece.ufl.edu\/index.php\/2025\/10\/22\/one-filter-many-forms-why-dsp-engineers-rebuild-the-same-filter-over-and-over-again\/","title":{"rendered":"One Filter, Many Forms: Why DSP Engineers Rebuild the Same Filter Over and Over Again"},"content":{"rendered":"\n<p class=\"has-small-font-size\"><em><strong>Disclaimer:<\/strong> this is an AI-generated article intended to highlight interesting concepts \/ methods \/ tools used within the Foundations of Digital Signal Processing course. This is for educating students as well as general readers interested in the course. The article may contain errors.<\/em><\/p>\n\n\n\n<p><em>Direct form, cascade form, lattice form\u2014filter structures aren\u2019t just mathematical gimmicks. They\u2019re your toolkit for making real-world systems stable, efficient, and actually work.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>If you&#8217;re knee-deep in a graduate-level digital signal processing (DSP) course, you&#8217;ve probably designed a filter or two. You\u2019ve plotted poles and zeros, wrangled a transfer function, maybe even written some MATLAB to test a low-pass filter on a noisy signal.<\/p>\n\n\n\n<p>Then someone tells you:<br>\u201cGreat filter. Now pick your <strong>structure<\/strong>.\u201d<\/p>\n\n\n\n<p>Wait\u2014what?<\/p>\n\n\n\n<p>Isn\u2019t a filter defined by its difference equation or transfer function? Isn\u2019t that enough?<\/p>\n\n\n\n<p>Short answer: no.<\/p>\n\n\n\n<p>The long answer is what this article is about. Because when you move from the page to the real world\u2014whether it&#8217;s a microcontroller, a medical device, or a machine learning pipeline\u2014<strong>how<\/strong> you implement a filter matters just as much as <strong>what<\/strong> the filter does.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf9b\ufe0f A Filter Is More Than Its Transfer Function<\/h2>\n\n\n\n<p>Let\u2019s take a typical <strong>IIR filter<\/strong>, described by the difference equation: <p class=\"ql-center-displayed-equation\" style=\"line-height: 18px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-bb655d5b46c28c27ab8decb7337a53b0_l3.png\" height=\"18\" width=\"523\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#121;&#91;&#110;&#93;&#32;&#61;&#32;&#45;&#97;&#95;&#49;&#32;&#121;&#91;&#110;&#45;&#49;&#93;&#32;&#45;&#32;&#92;&#99;&#100;&#111;&#116;&#115;&#32;&#45;&#32;&#97;&#95;&#78;&#32;&#121;&#91;&#110;&#45;&#78;&#93;&#32;&#43;&#32;&#98;&#95;&#48;&#32;&#120;&#91;&#110;&#93;&#32;&#43;&#32;&#92;&#99;&#100;&#111;&#116;&#115;&#32;&#43;&#32;&#98;&#95;&#77;&#32;&#120;&#91;&#110;&#45;&#77;&#93;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n\n\n\n<p>This corresponds to the transfer function: <p class=\"ql-center-displayed-equation\" style=\"line-height: 43px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-1e709c606e68bef89165c6142706c073_l3.png\" height=\"43\" width=\"266\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#72;&#40;&#122;&#41;&#32;&#61;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#98;&#95;&#48;&#32;&#43;&#32;&#98;&#95;&#49;&#32;&#122;&#94;&#123;&#45;&#49;&#125;&#32;&#43;&#32;&#92;&#99;&#100;&#111;&#116;&#115;&#32;&#43;&#32;&#98;&#95;&#77;&#32;&#122;&#94;&#123;&#45;&#77;&#125;&#125;&#123;&#49;&#32;&#43;&#32;&#97;&#95;&#49;&#32;&#122;&#94;&#123;&#45;&#49;&#125;&#32;&#43;&#32;&#92;&#99;&#100;&#111;&#116;&#115;&#32;&#43;&#32;&#97;&#95;&#78;&#32;&#122;&#94;&#123;&#45;&#78;&#125;&#125;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n\n\n\n<p>But this expression doesn\u2019t tell you how to build it.<\/p>\n\n\n\n<p>In implementation, we need to realize this as a <strong>structure<\/strong>\u2014an actual diagram of multipliers, adders, and delays. This isn\u2019t abstract: these structures define <strong>memory usage<\/strong>, <strong>roundoff behavior<\/strong>, and <strong>numerical stability<\/strong>. In real-time systems, especially those with fixed-point arithmetic, this can make or break your application.<\/p>\n\n\n\n<p>Let\u2019s walk through the most common filter structures, why they exist, and where they shine.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf1 Direct Form I and II: The Textbook Workhorses<\/h2>\n\n\n\n<p>If you&#8217;ve ever hand-coded a filter from its difference equation, chances are you used <strong>Direct Form I<\/strong>.<\/p>\n\n\n\n<p>It separates the <strong>feedforward (FIR)<\/strong> part and the <strong>feedback (IIR)<\/strong> part into two branches\u2014one processing past inputs <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-94ce5deda23062dfdb5271c8c1471399_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#91;&#110;&#93;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"29\" style=\"vertical-align: -5px;\"\/>, the other processing past outputs <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-65d5680c3db2de15f6cc1bf673270c7d_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#121;&#91;&#110;&#93;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"28\" style=\"vertical-align: -5px;\"\/>.<\/p>\n\n\n\n<p><strong>Direct Form I Structure:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Requires <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-a4d0407e2082109b919a4f39a6ae9042_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#109;&#97;&#120;&#40;&#77;&#44;&#32;&#78;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"88\" style=\"vertical-align: -5px;\"\/> delays for each branch.<\/li>\n\n\n\n<li>Good conceptual mapping from the difference equation.<\/li>\n\n\n\n<li>Common in high-level software (e.g., MATLAB\u2019s <code>filter()<\/code>).<\/li>\n<\/ul>\n\n\n\n<p>But Direct Form I uses <strong>twice as many delay elements<\/strong> as necessary.<\/p>\n\n\n\n<p>Enter <strong>Direct Form II<\/strong>, which cleverly merges the delay lines using state-variable techniques:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uses only <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-a4d0407e2082109b919a4f39a6ae9042_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#109;&#97;&#120;&#40;&#77;&#44;&#32;&#78;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"88\" style=\"vertical-align: -5px;\"\/> delays in total.<\/li>\n\n\n\n<li>More efficient in terms of memory.<\/li>\n\n\n\n<li>But\u2014<strong>more sensitive to roundoff error<\/strong>, especially in fixed-point systems.<\/li>\n<\/ul>\n\n\n\n<p>So while Direct Form II is mathematically elegant, it\u2019s not always the go-to in embedded applications.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde9 Cascade Form: Divide and Conquer (Stability Edition)<\/h2>\n\n\n\n<p>Now here\u2019s where things get interesting.<\/p>\n\n\n\n<p>Suppose your IIR filter has a high-order denominator polynomial. In practice, <strong>implementing a single high-order filter is numerically risky<\/strong>. Small roundoff errors in the coefficients can shift poles, destroy stability, and wreck frequency response.<\/p>\n\n\n\n<p><strong>Solution? Break it up.<\/strong><\/p>\n\n\n\n<p>Using <strong>partial fraction expansion<\/strong> (or factoring polynomials), we express the transfer function as a <strong>product of second-order sections (SOS)<\/strong>: <p class=\"ql-center-displayed-equation\" style=\"line-height: 19px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-3257e44119fd760b7f2fb5287163f5ac_l3.png\" height=\"19\" width=\"262\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#72;&#40;&#122;&#41;&#32;&#61;&#32;&#72;&#95;&#49;&#40;&#122;&#41;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#72;&#95;&#50;&#40;&#122;&#41;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#92;&#99;&#100;&#111;&#116;&#115;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#72;&#95;&#75;&#40;&#122;&#41;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n\n\n\n<p>Each Hk(z)H_k(z)Hk\u200b(z) is a <strong>biquad<\/strong>\u2014a second-order filter of the form: <p class=\"ql-center-displayed-equation\" style=\"line-height: 42px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-3ac092fb005f8a1a828cee326e9f6552_l3.png\" height=\"42\" width=\"217\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#72;&#95;&#107;&#40;&#122;&#41;&#32;&#61;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#98;&#95;&#48;&#32;&#43;&#32;&#98;&#95;&#49;&#32;&#122;&#94;&#123;&#45;&#49;&#125;&#32;&#43;&#32;&#98;&#95;&#50;&#32;&#122;&#94;&#123;&#45;&#50;&#125;&#125;&#123;&#49;&#32;&#43;&#32;&#97;&#95;&#49;&#32;&#122;&#94;&#123;&#45;&#49;&#125;&#32;&#43;&#32;&#97;&#95;&#50;&#32;&#122;&#94;&#123;&#45;&#50;&#125;&#125;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n\n\n\n<p>This is the <strong>cascade form<\/strong>. It has major benefits:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Improved <strong>numerical stability<\/strong>, especially in fixed-point.<\/li>\n\n\n\n<li>Localizes errors to individual stages.<\/li>\n\n\n\n<li>Allows <strong>modular tuning<\/strong>: change one section without rebuilding the entire system.<\/li>\n\n\n\n<li>Well-suited for hardware and software libraries (e.g., ARM CMSIS DSP, SciPy\u2019s <code>sosfilt()<\/code>).<\/li>\n<\/ul>\n\n\n\n<p>If you\u2019re designing a high-order filter for a hearing aid, seismic sensor, or biomedical device, <strong>cascade form is your friend<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf9a\ufe0f Parallel Form: When You Want Speed or Custom Gain Control<\/h2>\n\n\n\n<p>You can also expand a filter into <strong>parallel components<\/strong> using partial fraction expansion: <p class=\"ql-center-displayed-equation\" style=\"line-height: 47px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartdata.ece.ufl.edu\/wp-content\/ql-cache\/quicklatex.com-f84a44726a5b170808d7f7cc659b1e72_l3.png\" height=\"47\" width=\"347\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#72;&#40;&#122;&#41;&#32;&#61;&#32;&#92;&#115;&#117;&#109;&#95;&#123;&#107;&#125;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#65;&#95;&#107;&#125;&#123;&#49;&#32;&#45;&#32;&#112;&#95;&#107;&#32;&#122;&#94;&#123;&#45;&#49;&#125;&#125;&#32;&#43;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#40;&#111;&#112;&#116;&#105;&#111;&#110;&#97;&#108;&#32;&#70;&#73;&#82;&#32;&#116;&#101;&#114;&#109;&#41;&#125;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n\n\n\n<p>This <strong>parallel form<\/strong> is great when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You want <strong>fine control over frequency bands<\/strong>.<\/li>\n\n\n\n<li>You need fast <strong>dynamic range adjustments<\/strong>.<\/li>\n\n\n\n<li>You\u2019re implementing <strong>equalizers<\/strong> or <strong>reverberation units<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>It&#8217;s less commonly hand-coded by students, but shows up a lot in <strong>audio plugins<\/strong>, where each resonant filter (e.g., shelving EQ) can be a separate path.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\ude9e Lattice and Lattice-Ladder Structures: The Signal Processing Ninja Move<\/h2>\n\n\n\n<p>These aren\u2019t usually the first structures you learn\u2014but they\u2019re important for <strong>adaptive filtering<\/strong>, <strong>speech processing<\/strong>, and systems that need <strong>robust numerical behavior<\/strong>.<\/p>\n\n\n\n<p>The <strong>lattice structure<\/strong> represents a filter in terms of reflection coefficients, offering:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Excellent <strong>numerical stability<\/strong>.<\/li>\n\n\n\n<li>Recursive design based on <strong>orthogonal polynomials<\/strong>.<\/li>\n\n\n\n<li>Minimal roundoff sensitivity\u2014even in real-time speech codecs.<\/li>\n<\/ul>\n\n\n\n<p>If you\u2019ve heard of <strong>Levinson-Durbin recursion<\/strong>, this is where it connects.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Why So Many Structures?<\/h2>\n\n\n\n<p>Let\u2019s pause and ask: why implement the <em>same<\/em> filter in so many different ways?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>Numerical Stability<\/strong><\/h3>\n\n\n\n<p>High-order polynomials are fragile. Small changes in coefficients can swing poles outside the unit circle, turning a stable system into an unstable one. Structures like <strong>cascade<\/strong> and <strong>lattice<\/strong> reduce this risk by working with smaller, well-behaved pieces.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>Memory Constraints<\/strong><\/h3>\n\n\n\n<p>In embedded systems\u2014think wearables, IoT devices, or satellites\u2014you might have only a few kilobytes of memory. Direct Form II uses fewer delay elements, making it more appealing than Direct Form I.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>Hardware Optimization<\/strong><\/h3>\n\n\n\n<p>Certain architectures (DSP chips, FPGAs, GPUs) have hardware pipelines optimized for <strong>biquad filters<\/strong> or <strong>in-place buffer reuse<\/strong>. Picking the right form lets you exploit this for real-time performance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>Modularity and Maintainability<\/strong><\/h3>\n\n\n\n<p>Filter banks, EQs, and dynamic processors often rely on <strong>cascade or parallel forms<\/strong> to isolate bands or effects. This modularity makes tuning easier and more intuitive.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. <strong>Application-Specific Constraints<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Audio<\/strong>: Needs phase linearity and low noise\u2014favor cascade and real-input optimizations.<\/li>\n\n\n\n<li><strong>Medical<\/strong>: Requires stability and power efficiency\u2014favor lattice or direct form with careful scaling.<\/li>\n\n\n\n<li><strong>Radar\/Comms<\/strong>: Needs fast reconfigurability\u2014parallel or lattice forms often win here.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfae Analogy Time: Game Engines and Filter Structures<\/h2>\n\n\n\n<p>Think of filter structures like different game engines.<\/p>\n\n\n\n<p>The <strong>game logic<\/strong>\u2014your transfer function\u2014is the same. But the <strong>rendering engine<\/strong>\u2014how you implement and optimize\u2014determines performance, responsiveness, and realism.<\/p>\n\n\n\n<p>Want frame-perfect input? Use Unreal Engine. Want portability? Use Unity.<br>Want robust filters in a wearable ECG monitor? Use cascade form.<br>Want fast audio convolution on a GPU? Use a bank of FFT-based filters in parallel.<\/p>\n\n\n\n<p>Same goals, different executions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Final Thought: Choose Your Form with Purpose<\/h2>\n\n\n\n<p>Too often, filter design gets treated like a one-and-done operation: design, implement, done. But in professional DSP, <strong>the structure is not an afterthought<\/strong>\u2014it&#8217;s part of the engineering solution.<\/p>\n\n\n\n<p>Understanding the tradeoffs between forms helps you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build more efficient systems,<\/li>\n\n\n\n<li>Prevent catastrophic bugs,<\/li>\n\n\n\n<li>And collaborate across domains like hardware, software, and real-time signal processing.<\/li>\n<\/ul>\n\n\n\n<p>So next time you&#8217;re handed a transfer function, don\u2019t stop at the math. Ask the deeper question:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201cWhat structure makes this filter <em>work best in the real world<\/em>?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>Because DSP isn\u2019t just about transforming signals. It\u2019s about transforming ideas into systems that work\u2014with precision, speed, and clarity.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you&#8217;re knee-deep in a graduate-level digital signal processing (DSP) course, you&#8217;ve probably designed a filter or two. You\u2019ve plotted poles and zeros, wrangled a transfer function, maybe even written some MATLAB to test a low-pass filter on a noisy signal.<\/p>\n<p>Then someone tells you:<br \/>\n\u201cGreat filter. Now pick your structure.\u201d<\/p>\n<p>Wait\u2014what?<\/p>\n<p>Isn\u2019t a filter defined by its difference equation or transfer function? Isn\u2019t that enough?<\/p>\n<p>Short answer: no.<\/p>\n<p>The long answer is what this article is about. Because when you move from the page to the real world\u2014whether it&#8217;s a microcontroller, a medical device, or a machine learning pipeline\u2014how you implement a filter matters just as much as what the filter does.<\/p>\n","protected":false},"author":1,"featured_media":1405,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,78,76],"tags":[96,75],"class_list":["post-1401","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-human-insights","category-digital-signal-processing","category-education","tag-implementation","tag-signal-processing"],"_links":{"self":[{"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/posts\/1401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/comments?post=1401"}],"version-history":[{"count":3,"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/posts\/1401\/revisions"}],"predecessor-version":[{"id":1534,"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/posts\/1401\/revisions\/1534"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/media\/1405"}],"wp:attachment":[{"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/media?parent=1401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/categories?post=1401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smartdata.ece.ufl.edu\/index.php\/wp-json\/wp\/v2\/tags?post=1401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}