SisterRu

导航

 

目标:实现声卡数据采集、数字滤波器滤波、FFT变换

一、采样

声卡采集需要相关设备,这里将其简化,利用计算机自带的声卡进行录音,实现声卡数据采集。

  • 关于audiorecorder函数:针对声卡采集信号,用于创建录音对象,其前身是waverecord函数。用法如下:
    recorder = audiorecorder
    recorder = audiorecorder(Fs,nBits,nChannels)
    recorder = audiorecorder(Fs,nBits,nChannels,ID)
    参数:Fs为采样率,采样频率高于原采样频率,声音会尖锐,反之会低沉。nBits指定采样点的比特数,nChannels指定通道数,ID指定设备的ID。无参数时默认创建采样率8000Hz,8bit,单通道的对象。该对象的方法有recordblocking(录音),getaudiodata(获取录音数据)。
Fs = 8000;      
x1 = audiorecorder(Fs,8,1);
disp('开始说话');
recordblocking(x1,10);        %录音10秒钟
play(x1);      %回放录音数据
  • 保存录音文件
filename = 'yuyin.wav';
audiowrite(filename, y1, Fs);
  • 画出波形图
figure(1);
subplot(211);
x2 = getaudiodata(x1);  %获取录音数据
plot(x2);        %做录音数据的时域图形
title('原始语音信号')
xlabel('采样点 n');
ylabel('音量 n');

二、FFT变换

y1=fft(x2); %做length(x1)点的FFT
y1=fftshift(y1); %频率分量将会移到坐标中心
subplot(212);
plot(abs(y1));%画出原始语音信号的频谱图,这里保证了x轴的点数必须和y轴点数一致
title('原始语音信号的频谱');
grid on;

三、数字滤波器滤波

借鉴自https://blog.csdn.net/weixin_44372699/article/details/91512660

Fp=1500;
Fs=1200;
Ft=8000;
As=100;
Ap=1;
wp=2*pi*Fp/Ft;
ws=2*pi*Fs/Ft;
[n,wn]=ellipord(wp,ws,Ap,As,'s');
[b,a]=ellip(n,Ap,As,wn,'s');
[B,A]=bilinear(b,a,1);
[h,w]=freqz(B,A);
figure(2);
plot(w*Ft/pi/2,abs(h));
title('IIR低通滤波器');
xlabel('频率');
ylabel('幅度');
grid on;

[x,fs]=audioread('yuyin.wav');
x=x(:,1);
Y=fft(x);
y=filter(B,A,x);
Y1=fft(y);
n=0:length(x)-1;
t=(0:length(x)-1)/fs;
figure(7);
subplot(3,1,1);plot(t,y);grid on;
title('IIR低通滤波器滤波后语音信号时域波形');
xlabel('时间');
ylabel('赋值');
subplot(3,1,2);plot(n,abs(Y));grid on;
title('滤波前语音信号频谱');
xlabel('频率');
ylabel('幅度');
axis([0 1000000 0 8]);
subplot(3,1,3);plot(n,abs(Y1));grid on;
title('滤波后语音信号频谱');
xlabel('频率');
ylabel('幅度');
axis([0 1000000 0 8]);

posted on 2020-03-09 23:50  yiruzhao  阅读(1260)  评论(1编辑  收藏  举报