基于MATLAB的频谱、能量谱、三分之一倍频程分析

目录

1. 相关概念介绍

2. 代码实现

3. 场景仿真:


【若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动力,万分感谢!】

1. 相关概念介绍

以信号为例,信号在时域下的图形可以显示信号如何随着时间变化,而信号在频域下的图形(一般称为频谱)可以显示信号分布在哪些频率及其比例。频域的表示法除了有各个频率下的大小外,也会有各个频率的相位,利用大小及相位的资讯可以将各频率的弦波给予不同的大小及相位,相加以后可以还原成原始的信号。

时域:描述数学函数物理信号时间的关系;例如一个信号的时域波形可以表达信号随着时间的变化[1]。这符合现实世界中人们对信号的认识。

频域:是指在对函数信号进行分析时,分析其和频率有关部分,而不是和时间有关的部分,和时域一词相对[1]。这不符合现实世界中人们对信号的感官认识,但其为波的形式更符合现实世界中信号的存在,可以辅助人们完成对现实世界中信号的处理,由此产生更多的概率,如频谱、能谱、功率谱、倍频程谱等。

频谱:一个信号是由哪些频率的弦波所组成,也可以看出各频率弦波的大小及相位等信息。一般通过傅里叶变换将时域信号处理成频域信号,获得各个正弦信号的幅度和相位。所得的结果会是分别以幅度相位为纵轴,频率为横轴的两张图,不过有时也会省略相位的信息,只有不同频率下对应幅度的资料。有时也以“幅度频谱”表示幅度随频率变化的情形,“相位频谱”表示相位随频率变化的情形。

其频谱、能谱、功率谱、倍频程谱的相关概念可看这篇博客:频谱、能谱、功率谱、倍频程谱、1/3 倍频程谱_liyuanbhu的博客-CSDN博客_1/3倍频程

2. 代码实现

这里提供能谱和三分之一倍频程能谱相应的代码(代码不易,请点赞+收藏):

clc
clear
close all
%% 实验
% xn(:,1) = 1:320000;
% fs = 32000;      % 采样频率
% ts = 1/fs;     % 取样时间
% L = size(xn,1);     % 总取样次数
% t = (0:L-1) * ts;
% xn(:,2) = sin(2*pi*1000*t) + sin(2*pi*5000*t);

%% 正文
xn = xlsread('模拟数据.csv');

% 第一列为采样时刻,第二列为采样数值

%%%%%%%%%%%%%%%%%% 快速傅里叶变换 %%%%%%%%%%%%%%%%%%%%%

fs = 32000;      % 采样频率
ts = 1/fs;     % 取样时间
L = size(xn,1);     % 总取样次数
t = (0:L-1) * ts;
x = xn(:,2);
x = detrend(x,0);

%% 傅里叶变换
nfft = 2^15;

Y1 = fft(x,nfft);     % 傅里叶变换

f1 = (0:nfft-1)/(nfft-1)*fs;      % 频率向量

f = f1(1:nfft/2);       % 根据对称性取半

Y = Y1(1:nfft/2)*2/nfft;   % 根据对称性取半

YE = abs(Y); % 频域中的能量

ji_Ya = 2*10^(-5);  % 声压级基底

%% 计算频谱声压级
Ya_1 = 20 * log10(YE/ji_Ya);  % 计算频谱声压级
    
%% 计算总声压级
% 找出10-8k
YE_z = YE(find(f>=10&f<8000));
Z_Ya = 20 * log10(sqrt(sum(YE_z.^2))/ji_Ya)-3

%% 三分之一倍频程
% 定义三分之一倍频程的中心频率fc
fc = [20 25 31.5 40 50 63 80 100 125 160 200 ...
    250 315 400 500 630 800 1000 1250 1600 2000 ...
    2500 3150 4000 5000 6300 8000 10000 12500 16000];
% 下限频率
fl = round(fc/(2^(1/6)));
% 上限频率
fu = round(fc*(2^(1/6)));

fu(end) = f(end);   % 修复fu,末尾变为16000

%% 
% 频率向量f中有L/2个数据,对应的频率是(0:L/2-1)/(L/2-1)*fs/2;
nl = round(fl*2/fs*(nfft/2-1) + 1); % 下限频率对应的频率向量的序号
nu = round(fu*2/fs*(nfft/2-1) + 1); % 上限频率对应的频率向量的序号
nc = length(fc); % 中心频率的长度


for i = 1:nc
    nn = zeros(1,nfft);
    nn(nl(i):nu(i)) = Y1(nl(i):nu(i));
    nn(end-nu(i)+1:end-nl(i)+1) = Y1(end-nu(i)+1:end-nl(i)+1);
    cc = ifft(nn);
    YE_C(i) = sqrt(var(real(cc(1:nfft))));     % 求取1/3倍频程
%     YE_C(i) = sqrt(sum(YE(nl(i):nu(i)).^2)/2);    % 求取第i个中心频率的能量:频带的平均能量;
end

Ya_2 = 20 * log10(YE_C/ji_Ya); % 计算中心频率的声压级


%% 画图
a(1) = figure(1);
set(gca,'FontSize',10);
plot(0:length(t)-1,x);
title('原始信号');
xlabel('采样序号/采样频率为32000Hz');
ylabel('x');
set(gcf,'position',[100,100, 700, 400]); %设定figure的位置和大小 get current figure
set(gcf,'color','white'); %设定figure的背景颜色

a(2) = figure(2);
plot(f,Ya_1); 
set(gca,'FontSize',10);
title('频谱');
xlabel('频率/Hz');
ylabel('声压级/Db');
set(gcf,'position',[100,100, 700, 400]); %设定figure的位置和大小 get current figure
set(gcf,'color','white'); %设定figure的背景颜色

a(3) = figure(3);
set(gcf,'color','white'); %设定figure的背景颜色
set(gca,'FontSize',10);
plot(fc,Ya_2); 
title('1/3倍频程');
xlabel('中心频率/Hz');
ylabel('声压级/Db');
set(gcf,'position',[100,100, 700, 400]); %设定figure的位置和大小 get current figure



%% 导出数据
write_all = zeros(L,6);
write_all(:,1:2) = xn;
write_all(1:nfft/2,3) = f;
write_all(1:nfft/2,4) = Ya_1;
write_all(1:nc,5) = fc;
write_all(1:nc,6) = Ya_2;

xlswrite('matlab实验结果.xlsx',write_all);

saveas(a(1),'原始信号.bmp');
saveas(a(2),'频谱.bmp');
saveas(a(3),'三分之一倍频程.bmp');

3. 场景仿真:

输入数据:

得到的能谱 

 得到的三分之一倍频程能谱

【若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动力,万分感谢!】

  • 70
    点赞
  • 236
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 三分之一倍频程是指频率范围的一种度量方式,它表示的是频率范围中的一个值,位于频率范围的三分之一处。 Python是一种编程语言,它具有广泛的应用领域,包括数据分析、人工智能、机器学习等。在编写Python代码时,有时需要处理频率范围的计算或处理,包括计算三分之一倍频程。 为了计算三分之一倍频程,我们首先需要确定频率范围的两个边界值。假设这两个值分别为f1和f2。接下来,我们可以使用以下的公式计算三分之一倍频程三分之一倍频程 = f1 + (f2 - f1) / 3 这个公式的含义是,将频率范围平均分成三个部分,然后取第一个部分的末尾作为三分之一倍频程的值。 在Python中,可以使用变量和数学操作符来计算三分之一倍频程。下面是一个示例代码: ```python f1 = 100 # 频率范围的起始值 f2 = 300 # 频率范围的结束值 third_octave_bandwidth = f1 + (f2 - f1) / 3 # 计算三分之一倍频程 print("三分之一倍频程为:", third_octave_bandwidth) ``` 上述代码中的third_octave_bandwidth变量用于保存计算得到的三分之一倍频程的值。最后,通过使用print函数打印该值,我们可以在控制台上看到计算结果。 总结起来,三分之一倍频程是频率范围的其中一种度量方式,而在Python中,我们可以使用变量和数学操作符来计算和处理三分之一倍频程的值。 ### 回答2: 三分之一倍频程是指音频信号中频率的范围,其大小是整个频率范围的三分之一。Python 是一种广泛应用于程序开发和数据科学领域的编程语言。 在音频信号处理中,计算三分之一倍频程可以通过以下步骤实现: 1. 首先,需要获取音频信号的采样数据。可以使用Python中的库如`numpy`或`scipy`来导入和处理音频数据。 2. 接下来,使用傅里叶变换将时域信号转换为频域信号。Python中的`numpy.fft`模块提供了进行快速傅里叶变换的函数。 3. 计算信号的幅度,可以使用`numpy.fft.fft`函数获取频域信号的实部和虚部,然后通过计算幅度得到信号在每个频率上的幅度大小。 4. 根据幅度的大小降序排序,找到频率值为三分之一处的位置。可以使用`numpy.argsort`函数得到排序后的索引,然后取第三分之一处对应的频率值。 5. 最后,计算该频率值对应的频率范围。将该频率值乘以2,得到整个频率范围的三分之一倍频程。 总结起来,通过Python中的库和函数,可以方便地计算音频信号的三分之一倍频程。实现步骤包括获取音频数据、进行傅里叶变换、计算幅度、排序、找到三分之一位置的频率值,并最终计算出频率范围。这样可以帮助我们分析和处理音频信号中特定频率范围的信息。 ### 回答3: 三分之一倍频程是指将某个频率范围划分为三等分,每个部分之间的频率间隔相等。在python中,要实现这个功能,可以通过使用numpy库来实现。 首先,需要导入numpy库: ```python import numpy as np ``` 然后,定义一个函数来计算三分之一倍频程: ```python def calculate_third_octave(freq_range): # 计算频率范围的起始频率和终止频率 start_freq = freq_range[0] end_freq = freq_range[1] # 计算三分之一倍频程频率间隔 interval = (end_freq - start_freq) / 3 # 生成三分之一倍频程的频率数组 freq_array = np.arange(start_freq, end_freq, interval) return freq_array ``` 接下来,可以调用这个函数来计算三分之一倍频程: ```python freq_range = (20, 20000) # 设置频率范围为20Hz到20000Hz third_octave_freq = calculate_third_octave(freq_range) # 计算三分之一倍频程 print(third_octave_freq) # 输出三分之一倍频程的频率数组 ``` 这样,就可以得到三分之一倍频程的频率数组。输出结果可能类似于以下内容: ``` [ 20. 100. 500. 2500. 12500.] ``` 以上就是使用python实现三分之一倍频程的方法。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vm-1215

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值