信号処理におけるシンプルで実用的な方法 - 信号のエンベロープを抽出する

1. ヒルベルト変換を使用して信号の包絡線を計算します。

ヒルベルト変換は、特定の信号の包絡線を求める場合に最も一般的に使用されますが、すべての信号の包絡線を求める場合には適用できません。これは、エンベロープには厳密な定義がなく、状況に応じてエンベロープを計算する際の要件も異なるためです。以下では、信号の包絡線を取得するためのヒルベルト変換の使用法を紹介します。

MATLAB に付属するヒルベルト変換の機能を以下に紹介します。
名前: hilbert
機能: ヒルベルトはシーケンス x(n) を y(n) に変換し、x(n) と y(n) を解析信号のシーケンス z(n)=x(n)+jy (n) にします。

呼び出し形式:
z=hilbert(x)
説明: 関数 hilbert は、単に x(n) をヒルベルト変換して y(n) を取得するのではなく、y(n) を取得し、x(n) とともに解析信号を形成します
。 z(n) をシーケンスし、z(n) の係数と位相角を直接計算できます。
ケース 1. 信号 x(n)=120+96e^[(n/1500)^2]*cos(2π*n/600)、n=-5000:20:5000 として、信号のエンベロープを求めます。信号を設定した後、関数 hilbert を直接呼び出して信号のエンベロープを見つけ、次のようにプログラムの最初の部分を実行します。

clear all; clc; close all;

n=-5000:20:5000;            % 样点设置
% 程序第一部分:直接做做希尔伯特变换
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
Hx=hilbert(x);              % 希尔伯特变换
% 作图
plot(nt,x,'k',nt,abs(Hx),'r');
grid; legend('信号','包络');
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');
pause

 操作の結果は次のようになります。

 

プログラムの最初の部分を実行すると、上の図が得られます。この図から、ヒルベルト関数で信号を計算して得られた包絡線は、信号の包絡線ではなく、元の信号であることがわかります。 。 どうしてこれなの?このような不十分な包絡線が発生する理由は完全に DC 成分であるため、元の信号から DC 成分を除去した後、ヒルベルト関数によって信号の包絡線を求めます。
プログラムの 2 番目の部分は次のとおりです。

% 程序第二部分:消除直流后做希尔伯特变换
y=x-120;                    % 消除直流分量
Hy=hilbert(y);              % 希尔伯特变换
% 作图
figure(2)
plot(nt,y,'k',nt,abs(Hy),'r');
grid; legend('信号','包络');
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');
figure(3);
plot(nt,x,'k',nt,abs(Hy)+120,'r');
grid; legend('信号','包络'); hold on;
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');
pause

 操作の結果は次のようになります。

同時に、DC 成分をエンベロープに追加して元の信号に重ね合わせ、上の図の間違ったエンベロープを変更すると、次の図が得られます。

これは、信号に DC 成分がある場合、その DC 成分を除去し、その包絡線に DC 成分を重畳することで元の信号の包絡線を復元することで信号の包絡線を得ることができることを示しています。

2. ケプストラム法を使用して音声信号スペクトルの包絡線を計算します。

音声信号スペクトルの包絡線は音声分析にとってより重要であり、人間の発声器官の共鳴構造を反映しており、スペクトルの包絡線からフォルマント パラメータ (周波数と帯域幅) を抽出できます。ケプストラム法は、音声信号スペクトルの包絡線を抽出するために音声分析で一般的に使用されます。

ケプストラム解析の本質は、振幅スペクトルの対数をとり、再度スペクトル解析を行うことであるため、二次スペクトル解析とも呼ばれます。

2 つの信号が周波数領域で異なる周波数帯域を持っている場合、フィルタリングによって 2 つの信号を分離できることがわかっています。また、ケプストラム領域では、2 つの信号がケプストラム領域で異なるケプストラム周波数を占有する場合、逆フィルタリング (リフター) によって 2 つの信号をケプストラム領域で分離することもできます。
声帯によって生成されるパルスシーケンスの振動周波数は高く、口腔では筋肉の動きによって音を生成し、振動周波数は低いため、この 2 つはケプストラム内の異なるケプストラム帯域にあります。2 つの信号は逆フィルタリングによって分離され、周波​​数領域での励起パルスの応答と周波数領域でのチャネルの応答がそれぞれ取得されます。一般に、周波数領域における声道の応答は音声信号スペクトルの包絡線と呼ばれ、これを通じて音声のフォルマント情報を抽出することができます。

ケース 2. ファイル su1.txt から音声データを読み込み、音声信号のスペクトル包絡を取得します。プログラムリストは以下の通りです。

clear all; clc; close all;
y=load('su1.txt');                            % 读入数据
fs=16000; nfft=1024;                          % 采样频率和FFT的长度
time=(0:nfft-1)/fs;                           % 时间刻度
nn=1:nfft/2; ff=(nn-1)*fs/nfft;               % 计算频率刻度
Y=log(abs(fft(y)));                           % 取幅值的对数
z=ifft(Y);                                    % 按式(4-3-16)求取倒谱
mcep=29;                                      % 分离声门激励脉冲和声道冲击响应
zy=z(1:mcep+1);
zy=[zy' zeros(1,1024-2*mcep-1) conj(zy(end:-1:2))']; % 构建声道冲击响应的倒谱序列
ZY=fft(zy);                                   % 计算声道冲击响应的频谱
% 作图
plot(ff,Y(nn),'k'); hold on;                  % 画出信号的频谱图
plot(ff,real(ZY(nn)),'k','linewidth',2.5);    % 画出包络线
grid; hold off; ylim([-4 5]);
title('信号频谱和声道冲击响频谱(频谱包络)')
ylabel('幅值'); xlabel('频率/Hz'); 
legend('信号频谱','频谱包络')
set(gcf,'color','w');

操作の結果は次のようになります。

 

実験データ su1.txt のダウンロード リンクは次のとおりです。

https://mp.csdn.net/mp_download/manage/download/UpDetailed

参考文献: MATLAB デジタル信号処理の 85 の実践事例 - 上級入門、Song Zhiyong (編集)

おすすめ

転載: blog.csdn.net/qq_42233059/article/details/126460975#comments_27461754