自己录制一段语音或音乐信号,进行傅里叶变换,用通频带小于信号带宽的带通滤波器去除高频和低频,然后将滤波后的信号进行时域恢复,比较与原声在时域上有何差别。
回答六个问题:
- 使用的信号处理软件是 ?
- 语音信号的时域波形(截屏贴图)?
- 语音信号的频谱(截屏贴图),并说明语音信号的频带范围是多少 ?
- 带通滤波器的通频带(频谱)(截屏贴图),并说明通频带是多少 ?
- 输出信号的频谱(截屏贴图),并说明输出信号的频带范围是多少 ?
- 输出信号的时域波形(截屏贴图),并说明和最初的时域波形相比有什么变化,为什么 ?
我的回答
因为我信号与系统的课基本都是自己跟着mooc学的, 所以在布置上机作业的时候有点懵, 全程都是翻阅网上相关资料. 现将我的思路汇总一下.
应该用什么软件?
这个问题我问了ChatGPT, 它是这样说的.
问: 如果我想自己录制一段语音或音乐信号,进行傅里叶变换,用通频带小于信号带宽的带通滤波器去除高频和低频,然后将滤波后的信号进行时域恢复,比较与原声在时域上有何差别。应该用哪个信号处理软件?
答:
您可以使用许多不同的信号处理软件来完成这个任务,其中一些是免费的,而其他一些则需要购买许可证。
以下是一些常用的信号处理软件:
MATLAB:MATLAB是一种广泛使用的数学软件,它具有强大的信号处理功能,包括傅里叶变换、滤波器设计和时域重建等。MATLAB还有许多开源的信号处理工具箱,可以方便地完成各种信号处理任务。
GNU Octave:GNU Octave是一个免费的、开源的MATLAB兼容软件,它也具有强大的信号处理功能,包括傅里叶变换、滤波器设计和时域重建等。
Python:Python是一种流行的编程语言,具有广泛的信号处理库,如NumPy、SciPy和matplotlib。这些库提供了许多信号处理功能,包括傅里叶变换、滤波器设计和时域重建等。
Audacity:Audacity是一种免费的、开源的音频编辑软件,具有许多信号处理功能,包括傅里叶变换、滤波器设计和时域重建等。Audacity还具有用户友好的界面和易于使用的工具,可以方便地完成许多不同的音频处理任务。
无论您选择哪种软件,都应该具备实现您所需的信号处理功能所必需的工具和库。同时,您还需要了解信号处理的基础知识和技能,才能有效地完成这个任务。
因为只对MATLAB有基础, 所以我选择MATLAB来解决这个问题,在这里我不禁要感叹, MATLAB真的是什么都能干, 除了生孩子.
通过查CSDN和MATLAB官方文档,我差不多搞清楚了具体是用什么函数和函数的具体用法. 我用到了以下有关于本题的函数, 具体的用法还需要大家去自行查阅.
- audioread //读取本机的音频文件, **但不一定是wav文件, 我使用的是flac后缀文件
- soundsc //播放音频的函数
- fft //快速傅里叶变换 , **但是我不懂所谓"快速"傅里叶变换和傅里叶变换两者之间的区别
- 工具箱命令: fdatool //用来生成滤波器的, **好像是很新手的方法, 大佬都是自己写(?
参考文献
MATLAB音频信号处理(一):函数简易用法(audioread,sound函数)
什么是带通滤波器, 带通滤波器通频带是什么?
简单来说, 带通滤波器是让信号的某个频率区间的信号分量通过, 而其他频率的信号就被过滤了. 所以对带通滤波器来说就有一个能通过的最大频率( fH )和能通过的最小频率( fL ). 事实上我们观察带通滤波器的函数, 在 fH 和 fL 之外的信号并不是全为零, 还有个很小的区间是有值的. 这个我们在MATLAB中会用到.
参考文献我们需要从模电的角度去理解通频带, 滤波器的本质其实就是一个电路, 这个电路中存在着记忆元件, 那必然会有自身的性质, 这个自身的性质就包括了"通过滤波器的最大振幅". 类似于RLC电路的最大谐振频率.
如何用MATLAB写出自己想要的滤波器代码?
语音信号的时域波形如下图中第一张图所示.
语音信号的频带范围约为 0-22.0kHz,
输出信号的频带范围约为 0-22.0kHz 绝大部分集中在7.28-13.8kHz, 输出信号的频谱如下图中第四张图所示.
与最初的时域波形相比, 歌曲的绝大部分都被滤波掉了, 这是因为这首歌主要在低频区, 在滤波的过程中给滤掉了.但是歌曲只保留了第二, 三, 四, 八, 九节拍. 这是因为这些节拍中有相当一部分中频的音乐. 从而经过滤波之后仍有保留.输出信号的时域波形如下图中的第三张图所示.
结果可视化
滤波器通频带约为8.99-12.3kHz(最大幅度约为11.4kHz)
滤波器通频带
本文到此结束, 希望能帮到你.
思考了一下还是把源码贴出来, 希望能换取大家的赞同或者是喜欢, 这对我真的是很大的鼓励.
%% MATLAB对语音信号处理%采集音乐信号Fs = 44100; %采样频率, 我选择与后续中的fs保持一致samples1 = [1,10*Fs]; %仅对歌曲的前十秒进行采样[audio_data, fs] = audioread('Untitled.flac',samples1);L = length(audio_data);
% 听一听该音频% soundsc(audio_data, fs);% 从一个工科软件中听到自己最喜欢的音乐,真的有点感动.
%绘制时域图figure('Name','Original');tt = (1 : L) * 1/fs; %时间(纵坐标)subplot(4, 1, 1);plot(tt, audio_data);grid;title('时域图');xlabel('时间(s)');ylabel('Amp');
%频域分析L = 2^nextpow2(L); % 先从原始信号长度确定下一个 2 次幂的新长度,用尾随零填充信号以改善 fft 的性能Spectrum = fft(audio_data,L); % 快速傅里叶变换,转换为频域f_x = fs*(0:(L/2))/L; % 定义频域,即变换横坐标量纲为频率mag_FFT_audio_data = abs(Spectrum / L); % 取幅值,并归一化
subplot(4, 1, 2);plot(f_x,mag_FFT_audio_data(1 : L/2+1)) title('频域图');xlabel('频率(Hz)');ylabel('mag');
% 带通滤波器 (由fdatool生成)Fstop1 = 7200; % First Stopband FrequencyFpass1 = 9600; % First Passband FrequencyFpass2 = 12000; % Second Passband FrequencyFstop2 = 14400; % Second Stopband FrequencyDstop1 = 0.001; % First Stopband AttenuationDpass = 0.057501127785; % Passband RippleDstop2 = 0.0001; % Second Stopband Attenuationdens = 20; % Density Factor
% Calculate the order from the parameters using FIRPMORD.[N, Fo, Ao, W] = firpmord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 1 ...
0], [Dstop1 Dpass Dstop2]);
% Calculate the coefficients using the FIRPM function.b = firpm(N, Fo, Ao, W, {dens});Hd = dfilt.dffir(b);
%进行滤波filtered_audio_data = filter(Hd,audio_data);subplot(4, 1, 3);plot(tt, filtered_audio_data);grid;title('滤波后的时域图');xlabel('时间(s)');ylabel('Amp');
%对滤波之后的信号进行频域分析Filtered_Spectrum = fft(filtered_audio_data,L); % 快速傅里叶变换,转换为频域%f_x = fs*(0:(L/2))/L; % 定义频域,即变换横坐标量纲为频率Filtered_mag_FFT_audio_data = abs(Filtered_Spectrum / L); % 取幅值,并归一化
subplot(4, 1, 4);plot(f_x,Filtered_mag_FFT_audio_data(1 : L/2+1)) title('滤波之后频域图');xlabel('频率(Hz)');ylabel('mag');