【随手笔记】FFT资料整理(一)

fft计算信号的频谱 通过计算这些正弦和余弦波的振幅和相位信息,可以得到原始信号在频域上的表示。FFT算法通过使用分治算法和对称性质等优化技巧,可以高效地计算出这些频率成分fft将信号从时域转换到频域时,计算频率和幅值以及相位的公式的振幅和相位信息,从而实现了快速的频谱分析。因为计算出来的幅值大小与采样点数N 有关,较大的 N 会导致计算得到的幅值变大,而较小的 N 会导致计算得到的幅值变小,从而影响不同采样点数下的幅值比较和分析。对于一个单一频率的正弦波信号,其双边谱中该频率分量的幅值应该是信号振幅的一半。 阅读详情

(一)结果验证

函数波形示例1

#define Fs  44800
#define NPT 256
void InitBufInArray()
{
    int i = 0;
    float fx = 0;
    for(i=0; i<NPT; i++)
    {
        // fx = 1500 * sin(2*PI * i * 350.0 / Fs) +
        //      2700 * sin(2*PI * i * 8400.0 / Fs) +
        //      4000 * sin(2*PI * i * 18725.0 / Fs);

        fx = 1500 * sin(2*PI * i * 350.0 / Fs);//频率350hz幅值峰值为1500
        adc_buff[i] = ((uint16_t)fx) ;
			
		uart_output[3] = adc_buff[i] >> 8;
        uart_output[4] = adc_buff[i] & 0xff;
      	HAL_UART_Transmit(&huart1, (uint8_t *)uart_output, 5, 0xFFFF);
      	HAL_Delay(50);
		//printf("[%d]\r\n", adc_buff[i]);
    }
}

正弦-波峰1500-频率350
在这里插入图片描述

函数波形示例2

void InitBufInArray()
{
    int i = 0;
    float fx = 0;
    for(i=0; i<NPT; i++)
    {
        // fx = 1500 * sin(2*PI * i * 350.0 / Fs) +
        //      2700 * sin(2*PI * i * 8400.0 / Fs) +
        //      4000 * sin(2*PI * i * 18725.0 / Fs);

        //fx = 1500 * sin(2*PI * i * 350.0 / Fs);//频率350hz幅值峰值为1500
        fx = 2700 * sin(2*PI * i * 8400.0 / Fs);//频率8400hz幅值峰值为2700
        adc_buff[i] = ((uint16_t)fx) ;
			
		 uart_output[3] = adc_buff[i] >> 8;
         uart_output[4] = adc_buff[i] & 0xff;
         HAL_UART_Transmit(&huart1, (uint8_t *)uart_output, 5, 0xFFFF);
         HAL_Delay(50);
			//printf("[%d]\r\n", adc_buff[i]);
    }
}

正弦波形-峰值2700-频率8400
在这里插入图片描述

函数波形示例3

#define Fs  44800
#define NPT 256
void InitBufInArray()
{
    int i = 0;
    float fx = 0;
    for(i=0; i<NPT; i++)
    {
        // fx = 1500 * sin(2*PI * i * 350.0 / Fs) +
        //      2700 * sin(2*PI * i * 8400.0 / Fs) +
        //      4000 * sin(2*PI * i * 18725.0 / Fs);

        //fx = 1500 * sin(2*PI * i * 350.0 / Fs);//频率350hz幅值峰值为1500
        //fx = 2700 * sin(2*PI * i * 8400.0 / Fs);//频率8400hz幅值峰值为2700
        fx = 4000 * sin(2*PI * i * 18725.0 / Fs);//频率18725hz幅值峰值为4000
        adc_buff[i] = ((uint16_t)fx) ;
			
		uart_output[3] = adc_buff[i] >> 8;
        uart_output[4] = adc_buff[i] & 0xff;
        HAL_UART_Transmit(&huart1, (uint8_t *)uart_output, 5, 0xFFFF);
        HAL_Delay(50);
		//printf("[%d]\r\n", adc_buff[i]);
    }
}

正弦波形-峰值4000-频率18725
在这里插入图片描述

上述的三种波形整合之后

#define Fs  44800
#define NPT 256
void InitBufInArray()
{
    int i = 0;
    float fx = 0;
    for(i=0; i<NPT; i++)
    {
        fx = 1500 * sin(2*PI * i * 350.0 / Fs) +
             2700 * sin(2*PI * i * 8400.0 / Fs) +
             4000 * sin(2*PI * i * 18725.0 / Fs);

        //fx = 1500 * sin(2*PI * i * 350.0 / Fs);//频率350hz幅值峰值为1500
        //fx = 2700 * sin(2*PI * i * 8400.0 / Fs);//频率8400hz幅值峰值为2700
        //fx = 4000 * sin(2*PI * i * 18725.0 / Fs);//频率18725hz幅值峰值为4000

        adc_buff[i] = ((uint16_t)fx) ;
			
		uart_output[3] = adc_buff[i] >> 8;
        uart_output[4] = adc_buff[i] & 0xff;
        HAL_UART_Transmit(&huart1, (uint8_t *)uart_output, 5, 0xFFFF);
        HAL_Delay(50);
		//printf("[%d]\r\n", adc_buff[i]);
    }
}

波形的相互叠加和整合
在这里插入图片描述

一种波形的FFT结果

一个基波幅度为15,
波形1: 频率100Hz是幅度为10,
波形2: 频率150Hz是幅度为5.5
的信号

#define FFT_LENGTH  1000
        fx = 15 + 10*arm_sin_f32(2*PI*i*100/FFT_LENGTH) + 
        		  5.5*arm_sin_f32(2*PI*i*150/FFT_LENGTH);

下图可以看到FFT之后的频率图
显示的结果和网上基本一致
波形1和波形2的幅值和频率结果正确
在这里插入图片描述

函数整合波形验证-1

//已经验证和网上波形一致-
//基波幅度为15
//100HZ:幅度是10
//150HZ:幅度是5.5
fx = 15 + 10 * arm_sin_f32(2*PI * i* 100/ FFT_LENGTH) + 
			  5.5* arm_sin_f32(2*PI * i* 150/FFT_LENGTH);

原始波形是这样的
在这里插入图片描述
FFT结果是这样的
在这里插入图片描述

分解其中一个波形分析-2

fx = 15 + 10 * arm_sin_f32(2*PI * i* 100/ FFT_LENGTH) ;

原始波形是这样的
在这里插入图片描述
FFT结果是这样的
在这里插入图片描述

分解其中一个波形分析-3

fx = 15 +5.5* arm_sin_f32(2*PI * i* 150/FFT_LENGTH);

原始波形
在这里插入图片描述
FFT结果是这样的
在这里插入图片描述

函数整合波形验证-4

fx  = 100 +  10*   arm_sin_f32(2*PI* 10*i/ Fs)+
		     30*   arm_sin_f32(2*PI* 40*i/ Fs)+
	         50*   arm_sin_f32(2*PI* 80*i/ Fs);	

原始波形是这样的
在这里插入图片描述
FFT结果是这样的
在这里插入图片描述

(二)理论参考+标题是链接

音频相关基础知识(采样率、位深度、通道数、PCM、AAC)

  • 人耳听觉范围是20Hz~20kHz

  • 根据香农采样定理(也叫奈奎斯特采样定理)
    采集频率是原始信号频率的两倍才会尽可能还原

  • 现一般的专业设备的采样频率为44.1kHz。44.1kHz是专业音频中的最低采样率

  • 位深度: 一个采样点用多少位表示

  • 码率: 码率=采样率x位深度x声道数
    双声道的码率是44.1x16x2=1411.2kbps

音频可视化:采样、频率和傅里叶变换

  • 声音振动的两个关键属性是频率和振幅,
    频率是指一秒钟振动多少次,对应于音高,频率越高声音越尖锐刺耳。
    振幅则表示最大的位移值,对应于音量,振幅越大声音越响

  • 其中 AAC 和 MP3 格式是有损的,而 WAV 则是无损的

  • 傅里叶变换是一个函数,输入一串数字代表样本值,输出一串复数代表频率分量,每个数字具体代表的频率可以根据样本数量和采样频率计算得知, 我们不关心复数的方向,我们只关心复数的模,

  • 傅里叶输出的结果是左右对称的,因此只有一半的信息有价值

  • 随音乐跳动的每个柱子,对应的是一个频率或一组频率,而柱子的高度则是频率的分量大小,这两个信息傅里叶变换都能给到

常用的采样率

8,000 Hz - 电话所用采样率, 对于人的说话已经足够
11,025 Hz-AM调幅广播所用采样率
22,050 Hz和24,000 Hz- FM调频广播所用采样率
32,000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率
44,100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)所用采样率

在STM32单片机上使用傅里叶解析信号

  • 准备采样数据格式
  • 傅里叶变换
  • 取模
  • 归一化
  • 打印幅值

stm32f1单片机上用FFT测量信号频率(高精度、过程详细)

  • 由理论知识可知,幅值最大值的横坐标对应信号频率,纵坐标对应幅度

【经验分享】如何使用STM32提供的DSP库进行FFT

信号频谱图FFT原理与分析

  • 一个模拟信号,经过ADC采样之后,就变成了数字信号
  • 奈奎斯特采样定理 采样频率要大于信号频率的两倍
  • 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方
  • 假设采样频率为Fs,信号频率F,采样点数为N
  • 那么FFT之后结果就是一个为N点的复数
  • 复数 Z = a + b i
  • 每一个点就对应着一个频率点
  • 模值
  • 这个点的模值,就是该频率值下的幅度特性
  • 假设原始信号的峰值为A
  • FFT之后第一个点就是直流分量,它的模值就是直流分量的N倍
    直流分量 A = 模值 / N
  • 其余点 幅值 A = 模值 / (N/2)
  • 频率
  • 第一个点表示 0HZ
  • 最后一个点的下一个点 N+1个点 表示频率 Fs
  • 某点的频率 FN
  • FN = (N-1) * (Fs / N)
  • 频率最小的分辨率 = Fs / N
  • 假如采样频率1024,采样点1024,分辨到1HZ
  • 假如采样频率2048,采样点1024,分辨率2HZ
  • 假如采样频率1024,采样点2048,分辨率0.5HZ
  • 所以要增加频率的精确度 则要增加 采样点数
  • FFT之后某点用复数表示 z = a + b i
  • 这个复数的模值 A = 根号 aa + bb
  • 由于FFT结果具有对称性,通常只取前半部分的结果

我所理解的快速傅里叶变换(FFT)

  • FFT是离散傅立叶变换(DFT)的快速算法
  • 正弦曲线保真度。一个正弦曲线信号输入后,输出的仍是正弦曲线

在这里插入图片描述

  • 产生频谱泄露的主要原因是采样频率和原始信号频率不同步,造成周期的采样信号的相位在始端和终端不连续

如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧

在这里插入图片描述

基于STM32的FFT频谱分析+波形识别

FFT官方库

按照FFT官方库的说明,lBufOutArray和lBufInArray都必须是32位的数据类型,其中高16位存储实部,低16位存储虚部

基于STM32F103标准库实现FFT,并实现音乐频谱绘制

从时域到频域的转变,示波器FFT功能及运用

  • 栅栏效应是指对一函数进行采样,即是抽取采样点上的对应的函数值。其效果如同透过栅栏的缝隙观看外景一样,只有落在缝隙前的少数景象被看到
  • 谐波失真测量

谐波

是指对周期性非正弦交流量进行傅里叶级数分解所得到的大于基波频率整数倍的各次分量。谐波分量出现在基频的整数倍处

基波

最长的周期(最小的频率)最大的振幅的正弦波

谐波

频率等于基波频率整数倍的正弦波分量
在这里插入图片描述
在原始振荡波形中,包含基波和谐波
基波:和原始波形一样,最大周期,最小频率,最大振幅的正弦波分量
谐波:频率等于基波频率的整数倍的正弦波分量
例如工频为50HZ的交流电,其二次谐波频率为100HZ,三次谐波为150HZ
在这里插入图片描述
在这里插入图片描述

AM-调幅

振幅传播信号-频率保持不变

FM-调频

调制频率

STM32实现FFT,求取幅度频谱

在这里插入图片描述
峰峰值?

STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)

FFT 变换后,得到的是复数Re+j⋅Im ,包括实部和虚部:

实部 (Re):与余弦分量相关,决定信号的振幅。
虚部 (Im):与正弦分量相关,影响信号的相位。
计算幅值和相位:

幅值:表示信号在某频率下的强度,通过以下公式计算:幅值 = sqrt(Re^2 + Im^2)

相位:表示信号相对于参考信号的偏移,通过以下公式计算: 相位 = atan2(Im, Re)

STM32F4使用FPU+DSP库进行FFT运算的测试过程一

STM32F4使用FPU+DSP库进行FFT运算的测试过程二

  • arm_cfft_radix4_instance_f32 * S,float32_t * pSrc),这个函数在STM32F4xx_DSP_StdPeriph_Lib_V1.4.0库说明中,描述为–不要使用该功能,已经被arm_cfft_f32()替代

STM32F4 FFT 音乐频谱 不要太easy!

STM32 DSP库的快速添加 基于cubemx 调用,使用DSP库

  • 使用CubeMX 添加
  • 通过keil添加

STM32 CubeMX配置ADC+DMA进行FFT(1)

在RT-Thread studio中 为STM32系列开启DSP支持

FFT—快速傅里叶变换算法——STM32F1+DSP库实现(2)

ARM DSP库CMSIS-DSP的使用——以STM32F4浮点FFT为例

【STM32】STM32F4调用DSP库实现FFT运算

  • 音频频谱跳动的柱子是什么呢,Y轴是幅值,X轴是频率
  • 时间花费在 验证 一个波形函数的FFT正确结果是什么 这个事情上
  • 知道这个就可以验证 程序结果是否正确
  • 复数 Z = a + bi
  • 复数的模记为 |z|
  • |z| = 开根号(aa + bb)
  • 直流偏置 采集的波形信号没有负值 比如12位ADC 那采样结果 - 2048

代码整理(三)

方法一

//原始数据
for (int i = 0; i < FFT_LENGTH; i++)
{
    fft_inputbuf[i * 2]     = adcBuff[i] ;//实部赋值
    fft_inputbuf[i * 2 + 1] = 0;//虚部赋值,固定为0.
}
//傅里叶处理
arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_inputbuf, 0, 1);
//取模
arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH); 

//求幅值
fft_outputbuf[0] /= 1024;

for (int i = 1; i < FFT_LENGTH; i++)//输出各次谐波幅值
{
    fft_outputbuf[i] /= 512;
}


  
* arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_inputbuf, 0, 1);
输入数据进行傅里叶变换。它的输入参数含义如下

arm_cfft_sR_f32_len1024为傅里叶变换结构体,1024是要运算的点数。
我们在进行其他点数的计算时,比如说32个点的FFT,就可以用arm_cfft_sR_f32_len32。
fft_inputbuf为傅里叶变换需要处理的数据的首地址
第三个参数0是正变换,1是反变换
第四个参数一般是1 为1时是按位取反,系统配置为1。

经过傅里叶变换后的结果仍然为复数,虚部和实部的比可以计算出频率点的相位,
这个在这里不进行考虑。我们直接对复数取模。

​取模是实部和虚部的平方和取平均来算,不过我们没必要自己去这样写,
因为DSP库为我们提供了取模函数:
* arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);
参数含义如下:

fft_inputbuf源数据,形式为复数
fft_outputbuf取完模后的数据,形式为实数
FFT_LENGTH是取模的点数

方法二


#definen FFT_LENGTH 4096
float fft_inputbuf[FFT_LENGTH*2];	 // FFT输入数组,用于存放复数
float fft_outputbuf[FFT_LENGTH];	 // FFT输出数组,存放幅值
arm_cfft_radix4_instance_f32 scfft;   // FFT实例结构体

arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);
//初始化scfft结构体,设定FFT相关参数     

for(idex=0;idex<FFT_LENGTH;idex++) //
{			
	fft_inputbuf[2*idex]=(u16)(sampledata[idex]);    //生成输入信号实部
	fft_inputbuf[2*idex+1]=0;//虚部全部为0
}
//fft运算
arm_cfft_radix4_f32(&scfft,fft_inputbuf);  
//把运算结果复数求模得幅值
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);	

//求幅值
fft_outputbuf[0] /= 1024;

for (int i = 1; i < FFT_LENGTH; i++)//输出各次谐波幅值
{
    fft_outputbuf[i] /= 512;
}

* arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);
fftLen用于确定FFT变换的长度,
其默认有5种不同的设置,分别是(16/64/256/1024/4096)。
本系统采用4096点傅里叶变换,故将此设置为4096。
ifftFlag这个参数为0或者是1,为0时是傅里叶变换,为1时为傅里叶反变换,系统采用傅里叶变换,固将其配置为0;
bitReverseFlag的取值为0或者1,为1时是按位取反,系统配置为1。
最后这些参数存储在一个结构体指针S里面。
* arm_cfft_radix4_f32(&scfft,fft_inputbuf);  
本系统在计算基-4浮点傅里叶变换运算时就是利用这个函数,
通过指针pSrc传入采集到的输入信号数据(实部和虚部形式)。
这里要特别注意,输入信号应以复数的形式传入,实部放在奇数位,虚部放在偶数位。
进行4096点FFT运算,则pSrc指向4096个复数,实际应用中,
系统通过A/D采样,这样偶数位全部为0,奇数位为A/D转换器采集到的电压值。
同时FFT变换后的数据也存放在pSrc里面,pSrc必须不小于fftLen的长度。
另外,S结构体指针参数是由先该函数设置好,然后传入该函数的。
* void arm_cmplx_mag_f32(float32_t * pSrc,float32_t * pDst,uint32_t numSamples)

系统通过这个函数来计算复数模值,
可以对第二个函数* pSrc指向的输出结果进行傅里叶变换进行取模操作。
pSrc指向第二个函数傅里叶变换的结果,为复数输入数组指针;
pDst为输出数组指针,存储取模后的值;
numSamples是进行取模的点数,
系统进行4096点的傅里叶变换,
在此配置为4096即可。

方法三
FFT官方库

	for(i=0;i<NPT;i++)
  {
    lBufInArray[i]=ADC_Value[i]<<16;
  }
  cr4_fft_1024_stm32(lBufOutArray, lBufInArray, NPT);   
  
  GetPowerMag();
  
void cr4_fft_256_stm32(void *pssOUT, void *pssIN, u16 Nbin);

        参数1:*pssOUT一个用于存放结果的地址,通常为一个长度为Nbin/2的数组。

        参数2:*pssIN一个用于存放待变换数据的地址,通常为一个长度为Nbin的数组。

        参数3:指定待变换的点数。尽管参数在函数定义中被明确指定为 256 点,但这个参数可能用于函数的一般化设计,以便将来可以轻松地修改或扩展为其他点数的 FFT 变换。

  调用该函数之后,在pssOUT数组中就存放了进行FFT运算之后的结果数据。该数组中每个元素的数据格式为:高16位存储虚部,低16位存储实部
/******************************************************************
函数名称:GetPowerMag()
函数功能:计算各次谐波幅值  [short 的范围,是-32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。]
参数说明:
备  注:先将lBufOutArray分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)
*******************************************************************/
void GetPowerMag(void)
{
    signed short lX,lY;                                                  //算频率的话Fn=i*Fs/NPT  //由于此处i是从0开始的,所以不需要再减1
    float X,Y,Mag;                                                      
    unsigned short i;
    for(i=0; i<NPT/2; i++)                                                  //经过FFT后,每个频率点处的真实幅值  A0=lBufOutArray[0]/NPT
    {                                                                       //                                 Ai=lBufOutArray[i]*2/NPT
        lX  = (lBufOutArray[i] << 16) >> 16;  //lX  = lBufOutArray[i];
        lY  = (lBufOutArray[i] >> 16);
                                    
        X = NPT * ((float)lX) / 32768;//除以32768再乘65536是为了符合浮点数计算规律,不管他
        Y = NPT * ((float)lY) / 32768;
        Mag = sqrt(X * X + Y * Y) / NPT;
        if(i == 0)
            lBufMagArray[i] = (unsigned long)(Mag * 32768);   //0Hz是直流分量,直流分量不需要乘以2
        else
            lBufMagArray[i] = (unsigned long)(Mag * 65536);
    }
}
S1 算法学习之FFT 初识 1.FFT 的来历 简介: FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。 它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。 说明:FFT 是在DFT 的基础上进行改进的算法,DFT是离散傅氏变换。 A. 为什么要进行FFT呢? 答:因为信号在时间上,多个波形混杂在一起,不容... 阅读详情

相关推荐

Xilinx FPGA FFT 应用笔记

这个是2012年写的,现在给放上来了,其实百度文库也有。 系统工作环境:     芯片为:xilinxSpartan 6     软件:ise 12.2     IP coreFFT版本:7.1   目标:完成对放大板的标定 一、标定的过程简单介绍: 放大板包含3级程控放大器的放大电路、4个可选择的高频滤波器、1个50Hz的工频滤波器,放大板主要是针对低频信号,放大

yijingjijng的博客 3万+

频谱分析-FFT之后的那些事情

知乎上有几个比较好的讲解傅里叶变换的文章: 傅里叶分析之掐死教程(完整版) 通过这些文章都能对频谱有大致了解,但等你自己坐下了,要对一个信号进行频谱分析时,你会发现好多细微的问题其实并没有注意,下面,将讲讲那些细微的问题 #实现快速傅里叶变换 忠告:除非你自己为了验证你的能力,或为了验证你对对...

chizan3174的博客 2386

数字信号处理翻转课堂笔记9——时域抽取法基2FFT(DIT-FFT)

时域抽取法基2FFT(DIT-FFT)

WM2101的博客 1万+

Unity3D C# 信号FFT分析之5MHz超声波信号处理

上一篇《Unity3D C# 信号FFT分析之自定义波形UI控件》我们为了将采集到的波形展示出来,特意写了个脚本来绘制波形图。 这一篇我们将用一个实际采集到的5MHz的超声波探头信号来进行fft分析,并将频谱图绘制出来。效果如下。 ! 5MHz探头频谱图 闲话少说,直接进入主题。咱们先来看看理论基础,然后再看代码怎么写。 1 快速傅里叶分析 1.1 快速傅里叶(fft)分析是什么 学过信号与系统的同学应该知道,任何一个周期信号都可以分解为无数个正弦波的叠加,傅里叶分析就是把这些正弦波给求出来。 那么快速傅里

老王的博客 5654

基于python的快速傅里叶变换FFT(一)

基于python的快速傅里叶变换FFT(一) FFT可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 知识点 1、FFT——离散傅里叶变换(DFT)的快速算法。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变...

赵至柔的博客 5万+

c语言实现fft原理,新手小白一看就会,FFT算法的原理详解

原标题:新手小白一看就会,FFT算法的原理详解相信网上现在有很多关于FFT的教程,我曾经也参阅了很多网上的教程,感觉都不怎么通俗易懂。在基本上的研究FFT,并且通过编程的形式实现之后。我决定写一篇通俗易懂的关于FFT的讲解。因此我在接下来的叙述中尽量非常通俗细致的讲解。本人最早知道傅里叶变换的时候是沉迷于音乐的频谱跳动无法自拔,当时就很想做一个音乐频谱显示器。搜阅了很多资料之后,才了解到傅里叶变换...

weixin_42533243的博客 5563

深入浅出解释FFT(一)——用fft求频谱

FFT是离散傅立叶变换的快速算法,可以将一个信号变换 到频域。有些信号在时域上是很难看出什么特征的,但是如 果变换到频域之后,就很容易看出特征了。这就是很多信号 分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱 提取出来,这在频谱分析方面也是经常用的。 虽然很多人都知道FFT是什么...

chizhen4313的博客 1万+

【学习笔记】分治FFT

分治FFT 1. Luogu P4721 【模板】分治 FFT Problem 给定序列 g1…n−1g_{1\dots n - 1}g1…n−1​ ,求序列 f0…n−1f_{0\dots n - 1}f0…n−1​ 。 其中 fi=∑j=1ifi−jgjf_i=\sum_{j=1}^if_{i-j}g_jfi​=∑j=1i​fi−j​gj​ ,边界为 f0=1f_0=1f0​=1。 答案对 998244353998244353998244353 取模。 Solution 显然直接暴力FFT是 O(n2l

繁凡さん的博客 1793

labview将数组求fft_FFT海洋学习笔记(一)

目前的完成度:知乎视频​www.zhihu.comunity FFT海洋_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com其实我对这个结果并不十分满意,有一些有思路的想法也并没有时间去实现了,但是会在之后渲染的部分提一下。整体上个人感觉看上去还像是那么回事儿了。因为个人能力与时间的不足的关系,可能目前只能做到这个程度了。以后有机会可能还会再来改进。关于FFT海洋...

weixin_32668987的博客 1266

FFT板子整理

FFT 今天把之前一直没有系统整理的FFT弄了一下,考虑到分治版本的效率太低,于是还是写了蝴蝶变换的板子,感觉理解起来有些困难但是还是能够接受。 要记得inv=1inv=1inv=1是DFT,inv=−1inv = -1inv=−1是IDFT,之前比赛就这边有问题,要记住。 还有在计算答案的时候,需要对于结果除以整个的长度进行修正!! 我终于把之前没有看懂的复数根看懂了QAQ 找了一道十分裸的板子...

eternal‘s blog 603

FFT笔记

快速傅里叶变换FFT算法实现FFT时的思路输入倒序位,输出自然序的DIT-FFT的一些特点三级目录 算法实现FFT时的思路 使用三层for循环: 最外层:m,控制第几级蝶形运算; 中间层:   第m级蝶形运算,循环几个不同的蝶形结的系数,蝶形结的系数个数为2^(m-1),对应于两节点之间的距离, 最内层:   有几个同一系数的蝶形结,同系数的蝶形结之间的距离是2^m。 输入倒序位,输出自然序的DIT-FFT的一些特点 设N= 2^L: 每一级有N/2个蝶形结,第一级(列)的N/2个蝶形结构都是同一种蝶形运

qq_39597489的博客 2019

FFT的具体应用资料

傅立叶变换及其在AI中的应用 https://tech.sina.cn/2020-03-03/detail-iimxyqvz7418873.d.html 1.CNN中90%的计算是卷积,并且有许多方法可以降低卷积计算的强度,其中之一是快速傅立叶变换(FFT)。代替卷积,输入和滤波器矩阵通过FFT转换到频域,以进行乘法。然后,通过逆FFT(IFFT)将输出转换回时域。 2.FFT的另一用途是可用于降维或特征提取。 当数据集中的每个样本都是信号(时间序列或图像等)时,它可能包含数千个样本。但是它们实际上可能只对

m0_46612488的博客 1689

stm32f1单片机上用FFT测量信号频率(高精度、过程详细)FFT

代码基于stm32,简洁实用,可作为课设、毕设的参考,也可作为商用项目开发参考。

深入浅出解释 FFT(一)—— 用 fft 求频谱

An/(N/2)*cos (2*pi*Fn*t+Pn),即 2*An/N*cos (2*pi*Fn*t+Pn)。An = 根号 a*a+b*b,相位就是 Pn=atan2 (b,a)。50Hz 信号的幅度为:384/(N/2)=384/(256/2)=3;幅度为 192/(N/2)=192/(256/2)=1.5。一点 n(n 从 1 开始)表示的频率为:Fn=(n-1)*Fs/N;

ucliaohh的专栏 5847

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1980

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4480

MATLAB中FFT的整理

作为一个资深的健忘症患者,需要把每次用都忘记的FFT问题进行整理。 FFT可将信号从时域转换到频域。 首先是一些简单常识: 采样周期:两次采样之间的时间间隔。 采样频率:1/采样周期。每秒采样的点数。(注意:采样频率的选择应为信号频率的两倍以上) 时域采样将会造成频域的周期化,即频域的周期为时域的采样频率fs。 因此在画fft后的频域图时要注意横坐标每一小格的频率为fs/(N-1)。其中N为采样点...

qq_34233871的博客 1663

晶圆测试厂wafer map管理建议

按照Recipe设定bin定义 应有版本管理概念,一般使用最新版本做为活动版本即可 Bin明细中应包含 BinID、BinCode、BinName、BinType、BinColor、Description BinID可使用数字类型 BinCode可参照实际机台的Bin,用于匹配 有些公司也将BinID、BinCode理解为SBin和HBin 即 Software Bin & Hardware Bin 一般也将BinID对应到客户的Bin BinType

凯神做开发 1万+

java wav fft 振幅 频率_FFT海洋学习笔记(一)

目前的完成度:知乎视频​www.zhihu.comunity FFT海洋_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com其实我对这个结果并不十分满意,有一些有思路的想法也并没有时间去实现了,但是会在之后渲染的部分提一下。整体上个人感觉看上去还像是那么回事儿了。因为个人能力与时间的不足的关系,可能目前只能做到这个程度了。以后有机会可能还会再来改进。关于FFT海洋...

weixin_36431541的博客 371

ZYNQ RFSoC 的DAC如何做到从 0到Fs频段 信号输出

之前一直没太了解 RFSoC 的DAC如何输出在 Fs/2 到 Fs 频率范围内的信号,例如 ZCU216中的 ZU49DR,其RF-DAC最大采样率是 9.85GSPS,如果想输出的信号中心频率在5.8G,它是如何有效输出在第二奈奎斯特区域范围的信号的。

weixin_44630490的博客 1551

从摄像头选型到PCB布线:搞懂MIPI CSI带宽计算,避免你的嵌入式项目翻车

本文详细解析了MIPI CSI带宽计算在嵌入式项目中的关键作用,从摄像头选型到PCB布线提供全流程指导。通过实际案例和计算公式,帮助工程师准确计算带宽需求,避免图像丢帧和系统崩溃问题,同时优化PCB设计确保信号完整性。

weixin_30533109的博客 375

FFT学习笔记 FFT详解 一小时学会FFT

大家都很强,可与之共勉。我的知乎专栏

Lazer2001 2793

【汇编实战开发笔记】一段汇编代码如何“反编译”成C代码?

介绍了一种由汇编代码得到C代码的方法

一个专注于嵌入式IoT领域的架构师,深耕IoT领域多年,深度掌握IoT领域的相关技术栈,包括但不限于RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、嵌入式IoT系统的架构设计等。 1万+
上一篇: 【随手笔记】BLE版本了解(一)
下一篇: 【随手笔记】NB和4G信号杂记
Long-Run
博客等级 码龄3年 4600粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值