"按位取反加一"的新理解——在FFT频分析后如何获得其频率分量

一、“取反加一”的新理解

在前面的两篇博文中分别讨论的“取反加一”的两个作用。(取反加一应该是按位取反加一,下同)

第一个应用:在博文《(链接)

提到了:若想求一个负数的补码,则对其绝对值进行“取反加一”即可;

第二个应用:在博文《》(链接)

提到了:基想求一个负数的绝对值,则对其“取反加一”即可;

什么叫补码?补码就是负数在计算机中的表示。

在第一个应用中,对负数的绝对值取反加一得到其在计算机中的存储格式,实际上即对正数“取反加一”即可得到与其对应的负数;

在第二个应用中,对负数取反加一得到其绝对值,实际是即对负数“取反加一”即可得到与其对应的正数;

综合以上两点,在计算机中,对一个数进行“取反加一”操作,即对其乘“-1”,即得到相反数。

二、在FFT频谱分析后如何获得其频率分量值?

在博文《》(链接)

提到了一个性质,现重述如下:

对于信号s(t)=cos(2*pi*f*t)-j*sin(2*pi*f*t),对其进行符合奈奎斯特采样定理的采样,设采样率为fs,采样点数为N,得到数字信号s(n),n=[0,…,N-1],则对s(n)做DFT变换进行谱分析后得到S(k),k=[0,…,N-1]。观察S(k)的幅度谱,若k=0~N/2-1之间有峰值,则s(t)的频率f在-fs/2~0之间;若k=N/2~N-1之间有峰值,则s(t)的频率f在0~fs/2之间;并且有且只有一个峰值。

计算公式如下:设幅度谱峰值当k=k1时出现,则s(t)的频率为:

现在我们假设场景如下:我们得到了信号s(t),我们要知道它的频率f,我们可以对其进行fft运算,然后按照如上公式进行计算得到f,但是上面的公式是一个分段函数,这会给我们的计算带来一定的复杂性,下面阐述一种较为简单的方法。

我们假设N=128,用7bit表示;

那么k1的范围是0~127,如果将k1看成是有符号数,则其范围是0~63和-64~-1;

若对公式变形如下:

说到这儿,有一个性质要明白:对于一组使用n bit进行存储数据来说,如果将其当成无符号数来看,那么它的范围是0~2^n-1;但如果将其当成有符号数来看,那么它的范围是-2^(n-1)~2^(n-1)-1,其中0~2^(n-1)-1仍对应0~2^(n-1)-1,但2^(n-1)~2^n-1则对应-2^(n-1)~-1;其实转换关系也可是这样理解,对前一半的数它是不变的,因为它的最高位是0,因此是正数,这个大家都明白,但对于后一半的数,由于最高位是1,则它们是负数,转换关系是signed=unsigned-2^n;

因此对于N=7来说,它的无符号范围是0~127,而它的有符号范围是-64~63,其中-64~-1对应64~127,即64~127对应64-128~127-128;

如果我们将k1视为一个有符号数,则上面的公式可以变形为:

因此,实际上f=fs/N*(-k1),这就好办多了,将一个分段函数变成了一个函数表式。

我们若要求频率f,则对信号s(t)进行FFT后,找到峰值对应的位置,将其值视为有符号数,取其相反数,然后乘以fs/N即可,这样做是不是简便了很多了?

今天先分析到这儿,啥时候有了新的体会再继续……

经验分享 程序员 微信小程序 职场和发展