1. 频谱简介
频谱:信号的一种新的表示方法
1.1 FFT简介
在数字信号处理中常常需要用到离散傅里叶变换(DFT),以获取信号的频域特征。传统的DFT算法计算量大,耗时长,不利于计算机实时对信号进行处理。
FFT是一种DFT的高效算法,称为快速傅里叶变换(Fast Fourier Transform),它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。
假设信号频率为F,采样频率为Fs,采样点数为N:
那么FFT之后结果就是N个复数;
每一个复数对应着一个频率点,频率间隔(分辨率)为Fs/N;
第一个点表示直流分量(频率为0Hz),第n个点频率为Fn=(n-1)*Fs/N;
各频率点下复数的模值,就是该频率下正弦信号的幅度特性;
FFT结果具有对称性,通常我们只使用前半部分的结果。
2. 程序设计
使用FPGA开发板采集音频信号,然后使用Altera FFT IP核对输入的音频信号进行傅里叶变换,并将其频谱显示到4.3寸RGB TFT-LCD上。
2.1 系统框图
2.2 源码
module FFT_audio_lcd(
input sys_clk,
input rst_n,
// WM8978接口
output aud_mclk,
input aud_bclk,
input aud_lrc,
input aud_adcdat,
output aud_dacdat,
output aud_scl,
inout aud_sda,
//LCD接口
output lcd_hs,
output lcd_vs,
output lcd_de,
output [15:0] lcd_rgb,
output lcd_bl,
output lcd_rst,
output lcd_pclk
);
//wire define
wire clk50M;
wire clk10M;
wire audio_valid;
wire [15:0] audio_data;
wire fft_sop;
wire fft_eop;
wire fft_valid;
wire [15:0] fft_data;
//*****************************************************
//** main code
//*****************************************************
//锁相环模块
pll pll_inst (
.inclk0 (sys_clk),
.c0 (aud_mclk),
.c1 (clk50M),
.c2 (clk10M)
);
//例化WM8978控制模块
wm8978_ctrl u_wm8978_ctrl(
.clk (clk50M),
.rst_n (rst_n),
.aud_bclk (aud_bclk), // WM8978位时钟
.aud_lrc (aud_lrc), // 对齐信号
.aud_adcdat (aud_adcdat), // 音频输入
.aud_dacdat (aud_dacdat), // 音频输出
.aud_scl (aud_scl), // WM8978的SCL信号
.aud_sda (aud_sda), // WM8978的SDA信号
.dac_data (audio_data), // 输出的音频数据
.adc_data (audio_data), // 输入的音频数据
.rx_done (audio_valid), // 一次接收完成
.tx_done () // 一次发送完成
);
//对输入的音频数据进行傅里叶变换
FFT_top FFT_u(
.clk_50m (clk50M),
.rst_n (rst_n),
.audio_clk (aud_bclk),
.audio_data (audio_data),
.audio_valid (audio_valid),
.data_modulus (fft_data),
.data_sop (fft_sop),
.data_eop (fft_eop),
.data_valid (fft_valid)
);
//RGB_LCD 显示模块
LCD_top LCD_u(
.clk50M (clk50M),
.clk10M (clk10M),
.rst_n (rst_n),
.lcd_hs (lcd_hs),
.lcd_vs (lcd_vs),
.lcd_de (lcd_de),
.lcd_rgb (lcd_rgb),
.lcd_bl (lcd_bl),
.lcd_rst (lcd_rst),
.lcd_pclk (lcd_pclk),
.fft_data (fft_data),
.fft_sop (fft_sop),
.fft_eop (fft_eop),
.fft_valid (fft_valid)
);
endmodule
子模块详见FFT—音频频谱设计