音声信号処理の基礎知識のスペクトル、位相スペクトル、振幅スペクトル、パワースペクトル、スペクトログラム

1. 音声信号処理

オーディオ信号は、時間領域の実数ベクトルで表すことができます。この配列のサイズ = サンプル レート * オーディオの長さ。たとえば、サンプリング レートが 8000、長さが 15.6 秒のオーディオは、MATLAB では次のように表現されます。サイズ 15.6x8000=124800 の実数ベクトル

ここに画像の説明を挿入

matlab を使用して .wav ファイルと .pcm ファイルを読み取る 2 つの方法を次に示します。

1.1 wavの読み込み

[x1, fs_n] = audioread('test\Far_common.wav');   

1.2 リード PCM

fid_far = fopen("test\Far_common.pcm",'r'); 
x_far = fread(fid_far,inf,'int16');

ここに画像の説明を挿入

上の図からわかるように、MATLAB ではオーディオ信号はベクトルで表されます。

2. 音声信号処理の基礎知識

2.1、スペクトログラム

概念:信号の周波数とエネルギーの関係を示します。スペクトログラムは通常、位相スペクトログラムと振幅スペクトログラムの 2 つの部分で構成されます。

描画方法:時間領域のオーディオに対してフーリエ変換を実行し、その結果がスペクトログラムになります。ただし、2 つの情報が含まれているため、直接描画することはできません。位相スペクトログラムと振幅スペクトログラムとして別々にプロットできます。

[x1, fs_n] = audioread('D:\blog\新建文件夹\Far_common.wav');   
xi_fd = fft(x1);

観察結果から、一次元ベクトルをフーリエ変換すると、同じ大きさの複素ベクトルが得られることがわかる。

ここに画像の説明を挿入

2.1.1 位相スペクトログラム

概念:フーリエ解析では、周波数に伴う各成分の位相の変化が信号の位相スペクトルになります。

描画方法:スペクトルの振幅部分を位相角に置き換えます。ここでは、MATLAB の angle 関数を使用して描画します。

[x1, fs_n] = audioread('test\Far_common.wav');   

%频域信息
x1_fd = fft(x1);

%求相位谱
n=0:length(x1)-1;
f=n*fs_n/length(x1);
x1_abs = abs(x1_fd);
ph= 2*angle(x1_fd(1:length(x1)/2));
ph= ph *180/pi;
plot(f(1:length(x1)/2),ph(1:length(x1)/2));
xlabel('频率/hz'),ylabel('相角'),title('相位谱');

ここに画像の説明を挿入

ここでは、音声の選択の問題により、位相スペクトルが密になりすぎています。

2.1.2 振幅スペクトログラム

概念:フーリエ解析では、周波数に伴う各成分の振幅の変化が信号の振幅スペクトルになります。

描画方法:信号のFFT後の複素ベクトルに対してモジュロ演算を行い、得られた振幅スペクトルを取得します。

%求幅度谱
x1_fd_abs = abs(x1_fd);
plot(f(1:length(x1)/2),x1_fd_abs(1:length(x1)/2));
xlabel('频率/hz'),ylabel('幅度'),title('幅度谱');

ここに画像の説明を挿入

2.2、パワースペクトル(エネルギースペクトル):

概念:パワー スペクトルはパワー スペクトル密度関数の略称であり、単位周波数帯域内の信号パワーとして定義されます。これは、周波数に伴う信号電力の変化、つまり周波数領域での信号電力の分布を表します。

描画方法:信号のFFT後の複素ベクトルに対して実数部と虚数部の二乗和を演算し、パワースペクトルを求めます。(つまり、振幅スペクトルの二乗)

%求功率谱
for i=1:length(x1_fd)
    x1_power(i)=power(real(x1_fd(i)),2)+power(imag(x1_fd(i)),2);
end

ここに画像の説明を挿入

2.3、スペクトログラム:

概念:スペクトログラムの横軸は時間、縦軸は周波数、座標点の値は音声データのエネルギーです。3次元の情報を2次元の平面で表現するため、エネルギー値は色で表され、色が濃いほどその時点の音声エネルギーが強いことになります。2 次元座標を使用して 3 次元情報を表現すると理解できます。

描画方法:ここでは、MATLABのVoiceboxリソースパッケージにあるenframe関数を使用します。

%求语谱图
clear all; clc; close all;
[x,Fs]=audioread('test\Far_common.wav');   %读入数据文件
wlen=800; inc=80; win=hanning(wlen);% 设置帧长,帧移和窗函数
N=length(x); time=(0:N-1)/Fs;       % 计算时间
y=enframe(x,win,inc)';              % 分帧
fn=size(y,2);                       % 帧数
frameTime=(((1:fn)-1)*inc+wlen/2)/Fs; % 计算每帧对应的时间
W2=wlen/2+1; n2=1:W2;
freq=(n2-1)*Fs/wlen;                % 计算FFT后的频率刻度
Y=fft(y);                           % 短时傅里叶变换
clf                                 % 初始化图形
% 画出语谱图        
set(gcf,'Position',[20 100 600 500]);            
axes('Position',[0.1 0.1 0.85 0.5]);  
imagesc(frameTime,freq,abs(Y(n2,:))); % 画出Y的图像  
axis xy; ylabel('频率/Hz');xlabel('时间/s');
title('语谱图');
% 画出语音信号的波形  
axes('Position',[0.07 0.72 0.9 0.22]);
plot(time,x,'k');
xlim([0 max(time)]);
xlabel('时间/s'); ylabel('幅值');
title('语音信号波形');

ここに画像の説明を挿入

以上がオーディオ信号の処理・解析の過程で遭遇する振幅スペクトル、位相スペクトル、エネルギースペクトルの基礎知識を私なりにまとめたものですが、間違いがあればご指摘ください。

おすすめ

転載: blog.csdn.net/qq_44085437/article/details/125376660