<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>姬某人的小站</title><description>一个无趣的人</description><link>https://astro-pure.js.org</link><item><title>Radix-4 R2C DIT-FFT and C2R DIT-IFFT</title><link>https://astro-pure.js.org/blog/r2c-fft</link><guid isPermaLink="true">https://astro-pure.js.org/blog/r2c-fft</guid><description>一种加速实信号FFT/IFFT的算法</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;数学原理&lt;/h1&gt;
&lt;h2&gt;Complex to Complex (C2C) DIT-FFT&lt;/h2&gt;
&lt;p&gt;对于N点序列$x[n]$，它的离散傅里叶变换 Discrete Fourier Transform (DFT) 为
$$
X[k]=\sum_{n=0}^{N-1}x[n]e^{-j2\pi \frac{kn}{N}}=\sum_{n=0}^{N-1}x[n]W_{N}^{kn},\ k=0,\ 1,\ \dots,\ N-1
$$
将$x[n]$按奇偶索引拆分为两个长度为$M=N/2$的子序列：
$$
x_{{e}}[n]=x[2n],\ x_{o}[n]=x[2n+1],\ n=0,\ 1,\ \dots,\ M-1
$$
则它的DFT可以表示为
$$
\begin{aligned}
X[k]&amp;#x26;=\sum_{n=0}^{N/2-1}x[2n]e^{-j2\pi k\frac{2n}{N}}+\sum_{n=0}^{N/2-1}x[2n+1]e^{-j2\pi k\frac{2n+1}{N}} \
&amp;#x26;=\sum_{n=0}^{M}x_{e}[n]e^{-j2\pi \frac{kn}{M}}+e^{-j2\pi\frac{k}{N}}\sum_{n=0}^{M}x_{o}[n]e^{-j2\pi \frac{kn}{M}} \
&amp;#x26;=\sum_{n=0}^{M}x_{e}[n]W_{M}^{kn}+W_{N}^{k}\sum_{n=0}^{M}x_{o}[n]W_{M}^{kn} \
&amp;#x26;=E[k]+W_{N}^{k}O[k],\ k=0,\ 1,\ \dots,\ M-1
\end{aligned}
$$
由于周期性$E\left[ k+\frac{n}{2} \right]=E[k],\  O\left[ k+\frac{n}{2} \right]=O[k]$与对称性$W_{N}^{k+2/N}=-W_{N}^{k}$，有
$$
X[k+M]=E[k]-W_{N}^{k}O[k],\ k=0,\ 1,\ \dots,\ M-1
$$&lt;/p&gt;
&lt;h2&gt;Real to Complex (R2C) DIT-FFT&lt;/h2&gt;
&lt;p&gt;由于音频信号都是实信号（虚部均为0），将其当成复信号计算 FFT 时会产生很多不必要的冗余计算。
可以将N点输入实序列$x[n]$按奇偶索引拆分为两个长度为$M=N/2$的子序列：
$$
x_{{e}}[n]=x[2n],\ x_{o}[n]=x[2n+1],\ n=0,\ 1,\ \dots,\ M-1
$$
然后用偶数索引项作为实部，奇数索引项作为虚部，构造一个复序列：
$$
z[n]=x_{{e}}[n]+jx_{{o}}[n],\ n=0,\ 1,\ \dots,\ M-1
$$
对这个复序列做$M$点复DFT：
$$
Z[k]=\sum_{n=0}^{M-1}z[n]W_{M}^{kn}=E[k]+jO[k],\ k=0,\ 1,\ \dots,\ M-1\quad ①
$$
由于$x_{e}$和$x_{o}$都是实序列，故
$$
E^{&lt;em&gt;}[k]=E[M-k],\ O^{&lt;/em&gt;}[k]=O[M-k],\ k=1,\ 2,\ \dots,\ M-1
$$
其中特殊点$E[0],O[0]$需要单独计算。
又
$$
Z[M-k]=E[M-k]+jO[M-k]=E^{&lt;em&gt;}[k]+jO^{&lt;/em&gt;}[k]
$$
$$
Z^{&lt;em&gt;}[M-k]=E[k]-jO[k],\ k=1,\ 2,\ \dots,\ M-1\quad ②
$$
① + ②得
$$
E[k]=\frac{1}{2}(Z[k]+Z^{&lt;/em&gt;}[M-k]),\ k=1,\ 2,\ \dots,\ M-1
$$
① - ②得
$$
O[k]=-\frac{j}{2}(Z[k]-Z^{&lt;em&gt;}[M-k]),\ k=1,\ 2,\ \dots,\ M-1
$$
故
$$
\begin{aligned}
X[k]&amp;#x26;=E[k]+W_{N}^{k}O[k] \
&amp;#x26;=\frac{1}{2}[(Z[k]+Z^&lt;/em&gt;[M-k])-jW_{N}^{k}(Z[k]-Z^&lt;em&gt;[M-k])],\ k=1,\ 2,\ \dots,\ M-1
\end{aligned}
$$
又由于实数序列DFT的共轭对称性，有
$$
X[N-k]=X^&lt;/em&gt;[k],\ k=1,\ 2,\ \dots,\ M-1
$$
两个特殊点
$$
\begin{aligned}
X[0]&amp;#x26;=E[0]+O[0] \
&amp;#x26;=\mathrm{Re}{Z[0]}+\mathrm{Im}{Z[0]} \
X[M]&amp;#x26;=E[M]+W_{N}^{M}O[M] \
&amp;#x26;=E[0]-O[0] \
&amp;#x26;=\mathrm{Re}{Z[0]}-\mathrm{Im}{Z[0]}
\end{aligned}
$$
故有&lt;/p&gt;
&lt;p&gt;$$X[0]=\mathrm{Re}{Z[0]}+\mathrm{Im}{Z[0]}, k=0$$&lt;/p&gt;
&lt;p&gt;$$X[k]=\frac{1}{2}[(Z[k]+Z^&lt;em&gt;[M-k])-jW_{N}^{k}(Z[k]-Z^&lt;/em&gt;[M-k])], k=1,\ 2,\ \dots,\ \frac{N}{2}-1$$&lt;/p&gt;
&lt;p&gt;$$X[k]=\mathrm{Re}{Z[0]}-\mathrm{Im}{Z[0]}, k=\frac{N}{2}$$&lt;/p&gt;
&lt;p&gt;$$X[k]=X^*[N-k], k=\frac{N}{2}+1,\ \frac{N}{2}+2,\ \dots,\ N-1$$&lt;/p&gt;
&lt;p&gt;由此得到，要对$N$点实数序列做DFT时，可将这个实数序列当作一个$\frac{N}{2}$点的复序列，对这个复序列进行$\frac{N}{2}$点DFT，再由上式还原得到原本要求的$N$点DFT。&lt;/p&gt;
&lt;h2&gt;Complex to Real (C2R) IFFT&lt;/h2&gt;
&lt;p&gt;对于音频信号这样一个实信号，它的频域信号是具有共轭对称性的：
$$
X[N-k]=X[k]^*,\ k=1,\ 2,\ ,\dots,\ N-1
$$
故频谱信息只有一半是不重复的，也可以进行计算优化。前面 C2C DIT-FFT 的内容提到，将按奇偶索引拆分为两个长度为$M=N/2$的子序列后带入DFT定义可得
$$
\begin{aligned}
X[k]&amp;#x26;=E[k]+W_{N}^{k}O[k],\ k=0,\ 1,\ \dots,\ M-1 \
X[k+M]&amp;#x26;=E[k]-W_{N}^{k}O[k],\ k=0,\ 1,\ \dots,\ M-1
\end{aligned}
$$
从这两个式子中反解得到$E[k]$和$O[k]$：
$$
\begin{aligned}
E[k]&amp;#x26;=\frac{X[k]+X[k+M]}{2},\ k=0,\ 1,\ \dots,\ M-1 \
O[k]&amp;#x26;=\frac{X[k]-X[k+M]}{2W_{N}^{k}},\ k=0,\ 1,\ \dots,\ M-1
\end{aligned}
$$
然后根据FFT与IFFT的线性性质，我们就只需要构造复序列：
$$
T[k]=E[k]+jO[k]
$$
再对其进行$N/2$点IFFT：
$$
x[n]=\text{IFFT}{T[k]}=x_{e}[n]+jx_{o}[n],\ k=0,\ 1,\ \dots,\ M-1
$$
就得到了实部为时域偶数索引项，虚部为时域奇数索引项的复数信号，由于本身该算法在存储复数时实部和虚部就是交替存储的，得到的复数信号同时也是时域的实数信号，无需进行后处理。&lt;/p&gt;
&lt;h2&gt;Radix-4 DIT-FFT&lt;/h2&gt;
&lt;p&gt;本身我们需要做的是128点实数 FFT和复数IFFT，通过R2C和C2R的处理转化成了64点复数 FFT/IFFT，而由于64恰好是4的整数次幂，因此可将常用的 Radix-2 64点 FFT 改为Radix-4 64点 FFT，可将蝶形运算层数从6层缩减至3层，大幅减少循环次数与函数调用次数。
设序列$x[n]$的长度$N=4^m$，通过抽取将$x[n]$分为四个长度为$\frac{N}{4}$的子序列如下：
$$
\begin{aligned}
x_{1}[n]&amp;#x26;=x[4n] \
x_{2}[n]&amp;#x26;=x[4n+1] \
x_{3}[n]&amp;#x26;=x[4n+2] \
x_{4}[n]&amp;#x26;=x[4n+3]
\end{aligned}
$$
则$x[n]$的DFT可表示为
$$
\begin{aligned}
X[k] &amp;#x26; =\sum_{n=0}^{N-1}x[n]W_N^{nk} \
&amp;#x26; =\sum_{n=0}^{N/4-1}x[4n]W_N^{4nk}+\sum_{n=0}^{N/4-1}x[4n+1]W_N^{(4n+1)k}+\sum_{n=0}^{N/4-1}x[4n+2]W_N^{(4n+2)k}+\sum_{n=0}^{N/4-1}x[4n+3]W_N^{(4n+3)k} \
&amp;#x26; =\sum_{n=0}^{N/4-1}x[4n]W_{N/4}^{nk}+\sum_{n=0}^{N/4-1}x[4n+1]W_{N/4}^{nk}W_N^k+\sum_{n=0}^{N/4-1}x[4n+2]W_{N/4}^{nk}W_N^{2k}+\sum_{n=0}^{N/4-1}x[4n+3]W_{N/4}^{nk}W_N^{3k} \
&amp;#x26; =\sum_{n=0}^{N/4-1}x_1[n]W_{N/4}^{nk}+\sum_{n=0}^{N/4-1}x_2[n]W_{N/4}^{nk}W_N^k+\sum_{n=0}^{N/4-1}x_3[n]W_{N/4}^{nk}W_N^{2k}+\sum_{n=0}^{N/4-1}x_4[n]W_{N/4}^{nk}W_N^{3k} \
&amp;#x26; =X_1[k]+W_N^kX_2[k]+W_N^{2k}X_3[k]+W_N^{3k}X_4[k]
\end{aligned}
$$
其中，$X_{1}(k),\ X_{2}(k),\ X_{3}(k),\ X_{4}(k)$ 分别为$x_{1}[n],\ x_{2}[n],\ x_{3}[n],\ x_{4}[n]$ 的$\frac{N}{4}$点DFT，$k=1,\ 2,\ \dots,\ \frac{N}{4}-1$
对于$k=\frac{N}{4}-1$之后的$X[k]$计算过程如下：
$$
\begin{aligned}
X[k+N/4]&amp;#x26;=X_{1}[k]+W_{N}^{k+N/4}X_{2} [k]+W_{N}^{2(k+N/4)}X_{3}[k]+W_{N}^{3(k+N/4)}X_{4}[k] \
&amp;#x26;=X_{1}[k]-jW_{N}^{k}X_{2}[k]-W_{N}^{2k}X_{3}[k]+jW_{N}^{3k}X_{4} [k] \
X[k+2N/4]&amp;#x26;=X_{1}[k]+W_{N}^{k+2N/4}X_{2} [k]+W_{N}^{2(k+2N/4)}X_{3}[k]+W_{N}^{3(k+2N/4)}X_{4}[k] \
&amp;#x26;=X_{1}[k]-W_{N}^{k}X_{2}[k]+W_{N}^{2k}X_{3}[k]-W_{N}^{3k}X_{4}[k] \
X[k+3N/4]&amp;#x26;=X_{1}[k]+W_{N}^{k+3N/4}X_{2} [k]+W_{N}^{2(k+3N/4)}X_{3}[k]+W_{N}^{3(k+3N/4)}X_{4}[k] \
&amp;#x26;=X_{1}[k]+jW_{N}^{k}X_{2}[k]-W_{N}^{2k}X_{3}[k]-jW_{N}^{3k}X_{4}[k]
\end{aligned}
$$
用图表示上述过程：
&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/r2c-fft/Fig-1.png&quot; alt=&quot;Fig-1&quot;&gt;
我们可以继续用上述的方法将每个子序列继续划分，直到最后序列长度为4。4点的DFT计算如下：
$$
\begin{bmatrix}{X[0]}\ {X[1]}\ {X[2]}\ {X[3]}\end{bmatrix}=\begin{bmatrix}{1}&amp;#x26;{1}&amp;#x26;{1}&amp;#x26;{1}\ {1}&amp;#x26;-{j}&amp;#x26;-{1}&amp;#x26;-{j}\ {1}&amp;#x26;-{1}&amp;#x26;{1}&amp;#x26;-{1}\ {1}&amp;#x26;{j}&amp;#x26;-{1}&amp;#x26;{j}\end{bmatrix}\cdot\begin{bmatrix}{x[0]}\ {x[1]}\ {x[2]}\ {x[3]}\end{bmatrix}
$$&lt;/p&gt;</content:encoded><h:img src="https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/r2c-fft/cover.png"/><enclosure url="https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/r2c-fft/cover.png"/></item><item><title>失真效果器的制作</title><link>https://astro-pure.js.org/blog/distortion-effect</link><guid isPermaLink="true">https://astro-pure.js.org/blog/distortion-effect</guid><description>尝试自制失真效果器，希望以后演出的时候能用上自己亲手做的单块效果器</description><pubDate>Thu, 17 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;初次尝试&lt;/h1&gt;
&lt;p&gt;第一次开始尝试自制效果器还是在去年年底，在CSDN上找到了一个博主自制失真效果器的文章：&lt;a href=&quot;https://blog.csdn.net/qq_41342525/article/details/105127331&quot;&gt;自制电吉他效果器 DIY&lt;/a&gt;，便照着文章自己做了一下，电路板焊接还算成功，但是由于本身电路设计就很粗糙，最后测试音色感觉太干，不能拿去实际使用。&lt;/p&gt;
&lt;h2&gt;电路图绘制&lt;/h2&gt;
&lt;p&gt;采用&lt;strong&gt;Altium Designer&lt;/strong&gt;软件，按照那位博主的电路图绘制。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/circuit_1.png&quot; alt=&quot;简单失真效果器电路图&quot;&gt;&lt;/p&gt;
&lt;h2&gt;PCB板绘制&lt;/h2&gt;
&lt;p&gt;其中有几个元件在原生库里没有封装，我自己画了封装，当时我还是第一次使用这个软件，过程还是蛮麻烦的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/PCB_1.png&quot; alt=&quot;简单失真效果器PCB板图&quot;&gt;&lt;/p&gt;
&lt;h2&gt;PCB板打印&amp;#x26;元件焊接&lt;/h2&gt;
&lt;p&gt;打印PCB板的厂家我选的是嘉立创，速度还行而且价格很便宜(甚至五张不超过10*10cm的样板免费)。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/emptyboard_1.png&quot; alt=&quot;简单失真效果器PCB空板&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于之前有焊接电路板的经验，焊接过程可以说是轻车熟路，不到两个小时就焊完了并且没出什么差错。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/board_1_1.png&quot; alt=&quot;简单失真效果器电路板成品图1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/board_1_2.png&quot; alt=&quot;简单失真效果器电路板成品图2&quot;&gt;&lt;/p&gt;
&lt;p&gt;插上电源，接上吉他的时候发现能正常工作，还是蛮开心的。但是音色确实不太行。所以我又萌生了复刻大厂经典效果器的想法。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;BOSS SD-1 Overdrive的复刻&lt;/h1&gt;
&lt;p&gt;BOSS在效果器行业的地位绝对是毋庸置疑的，并且发布于1981年的SD-1 Overdrive一直以来销量都很高，网络上也能找到现成的电路图，所以我选择先复刻这款经典效果器。&lt;/p&gt;
&lt;h2&gt;电路图绘制&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/circuit_2.png&quot; alt=&quot;BOSS SD-1 Overdrive电路图&quot;&gt;&lt;/p&gt;
&lt;h2&gt;PCB板绘制&lt;/h2&gt;
&lt;p&gt;之前第一次尝试画PCB板的时候有很多设计得不好的地方，这次我逐一做了改进。&lt;/p&gt;
&lt;h3&gt;元件分层设计&lt;/h3&gt;
&lt;p&gt;这次在元件的分布上我采用了双层设计，除发光二极管以外的贴片元件都放在了bottom layer，直插元件都放在了top layer，这样更方便焊接，也能缩小板子的面积，给top overlay层留出更大的空间印图案。&lt;/p&gt;
&lt;h3&gt;电源、输入输出接口位置调整&lt;/h3&gt;
&lt;p&gt;上次我画的电源接口的位置属实下饭，离板子边缘还有不小距离，导致没办法设计装壳。于是这次我专门等元件都到货之后再开始画封装和PCB板，量好各个元件的尺寸后将电源、输入输出接口的位置都调整到了板子边缘，方便装壳。&lt;/p&gt;
&lt;h3&gt;最终效果&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/PCB_2_top.png&quot; alt=&quot;BOSS SD-1 Overdrive PCB Diagram Top Layer&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/PCB_2_bottom.png&quot; alt=&quot;BOSS SD-1 Overdrive PCB Diagram Bottom Layer&quot;&gt;&lt;/p&gt;
&lt;h2&gt;PCB板打印&amp;#x26;元件焊接&lt;/h2&gt;
&lt;p&gt;依旧嘉立创(免费打样+包邮，着实令人感动)。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/emptyboard_2_top.png&quot; alt=&quot;BOSS SD-1 Overdrive PCB实物Top Layer&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/emptyboard_2_bottom.png&quot; alt=&quot;BOSS SD-1 Overdrive PCB实物Bottom Layer&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;暂停说明&lt;/h1&gt;
&lt;p&gt;最近这段时间一直在忙网页建设的事，板子到手后只焊了十个电阻，等我把bug改完就会继续开焊喽，到时候再继续更新这篇文章。&lt;/p&gt;</content:encoded><h:img src="https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/cover.png"/><enclosure url="https://greatbastard-blog-1309491218.cos.ap-chengdu.myqcloud.com/img/Articles/Distortion_Effector/cover.png"/></item></channel></rss>