如何用51单片机实现音频信号的频谱显示(在LCD上显示)

如何用51单片机实现音频信号的频谱显示(在LCD上显示),第1张

12864可以作为显示器件

频谱分析涉及到FFT,如果你这个不会,那还是再学习学习吧。

简单原理: 通过快速FFT将音频分析成多个正弦波的组合,正弦波的频率就是高音低音,振幅就是音量的大小。

FFT运算量比较大,普通51难以接受,要选用1T的高速51,

声音信号要通过ad进行采样,然后将其进行分析,所以要选用一个精度高速度快的ad,一般高档51中ad可以胜任这个工作

声音信号在ad采样之前需要调整成合适振幅的信号

频谱可用CPSD函数做:

cpsd(y,y,window,noverlap,nfft,fs)

这里window是加窗函数,一般默认就可以了,noverlap是覆盖数据个数,一般noverlap=0.5*nfft,fs是采样频率

比如:t=0:0.01:100;采样频率是1/0.01=100Hz

y=(1+0.2*sin(90*2*pi*t)+0.2*sin(150*2*pi*t)).*cos(108.1*10^6*2*pi*t)

那么cpsd(y,y,[],512,1024,100)

这个信号的频率分量分别为30、150和600Hz,因此可分别设计一个低通、带通和高通的滤波器来提取。以FIR滤波器为例,程序如下:

clearfs=2000t=(1:1000)/fs

x=10*cos(2*pi*30*t) cos(2*pi*150*t) 5*cos(2*pi*600*t)

L=length(x)N=2^(nextpow2(L))Hw=fft(x,N)

figure(1)subplot(2,1,1)plot(t,x)

grid ontitle('滤波前信号x')xlabel('时间/s')% 原始信号

subplot(2,1,2)plot((0:N-1)*fs/L,abs(Hw))% 查看信号频谱

grid ontitle('滤波前信号频谱图')xlabel('频率/Hz')ylabel('振幅|H(e^jw)|')

%% x_1=10*cos(2*pi*30*t)

Ap=1As=60% 定义通带及阻带衰减

dev=[(10^(Ap/20)-1)/(10^(Ap/20) 1),10^(-As/20)]% 计算偏移量

mags=[1,0]% 低通

fcuts=[60,100]% 边界频率

[N,Wn,beta,ftype]=kaiserord(fcuts,mags,dev,fs)% 估算FIR滤波器阶数

hh1=fir1(N,Wn,ftype,kaiser(N 1,beta))% FIR滤波器设计

x_1=filter(hh1,1,x)% 滤波

x_1(1:ceil(N/2))=[]% 群延时N/2,删除无用信号部分

L=length(x_1)N=2^(nextpow2(L))Hw_1=fft(x_1,N)

figure(2)subplot(2,1,1)plot(t(1:L),x_1)

grid ontitle('x_1=10*cos(2*pi*30*t)')xlabel('时间/s')

subplot(2,1,2)plot((0:N-1)*fs/L,abs(Hw_1))% 查看信号频谱

grid ontitle('滤波后信号x_1频谱图')xlabel('频率/Hz')ylabel('振幅|H(e^jw)|')

%% x_2=cos(2*pi*150*t)

Ap=1As=60% 定义通带及阻带衰减

dev=[10^(-As/20),(10^(Ap/20)-1)/(10^(Ap/20) 1),10^(-As/20)]% 计算偏移量

mags=[0,1,0]% 带通

fcuts=[80,120,180,220]% 边界频率

[N,Wn,beta,ftype]=kaiserord(fcuts,mags,dev,fs)% 估算FIR滤波器阶数

hh2=fir1(N,Wn,ftype,kaiser(N 1,beta))% FIR滤波器设计

x_2=filter(hh2,1,x)% 滤波

x_2(1:ceil(N/2))=[]% 群延时N/2,删除无用信号部分

L=length(x_2)N=2^(nextpow2(L))Hw_2=fft(x_2,N)

figure(3)subplot(2,1,1)plot(t(1:L),x_2)

grid ontitle('x_2=cos(2*pi*150*t)')xlabel('时间/s')

subplot(2,1,2)plot((0:N-1)*fs/L,abs(Hw_2))% 查看信号频谱

grid ontitle('滤波后信号x_2频谱图')xlabel('频率/Hz')ylabel('振幅|H(e^jw)|')

%% x_3=5*cos(2*pi*600*t)

Ap=1As=60% 定义通带及阻带衰减

dev=[10^(-As/20),(10^(Ap/20)-1)/(10^(Ap/20) 1)]% 计算偏移量

mags=[0,1]% 高通

fcuts=[500,550]% 边界频率

[N,Wn,beta,ftype]=kaiserord(fcuts,mags,dev,fs)% 估算FIR滤波器阶数

hh2=fir1(N,Wn,ftype,kaiser(N 1,beta))% FIR滤波器设计

x_3=filter(hh2,1,x)% 滤波

x_3(1:ceil(N/2))=[]% 群延时N/2,删除无用信号部分

L=length(x_3)N=2^(nextpow2(L))Hw_3=fft(x_3,N)

figure(4)subplot(2,1,1)plot(t(1:L),x_3)

grid ontitle('x_3=5*cos(2*pi*600*t)')xlabel('时间/s')

subplot(2,1,2)plot((0:N-1)*fs/L,abs(Hw_3))% 查看信号频谱

grid ontitle('滤波后信号x_3频谱图')xlabel('频率/Hz')ylabel('振幅|H(e^jw)|')


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7858361.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存