比较两个信号的频率成分

本文介绍了如何使用Matlab中的periodogram和mscohere函数来分析两个声音信号的功率谱,发现它们在165Hz和35Hz处有共享频率成分。通过频谱相干性计算,无需分别研究每个信号,就能识别出这些共有的频率特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

频谱相干性有助于识别频域中信号之间的相似性。大数值表示信号共有的频率分量。

        将两个声音信号加载到工作区中。以 1 kHz 的频率对其进行采样。使用 periodogram 计算其功率频谱,并以彼此相邻的方式对其绘图。

load relatedsig

Fs = FsSig;

[P1,f1] = periodogram(sig1,[],[],Fs,'power');
[P2,f2] = periodogram(sig2,[],[],Fs,'power');

subplot(2,1,1)
plot(f1,P1,'k')
grid
ylabel('P_1')
title('Power Spectrum')

subplot(2,1,2)
plot(f2,P2,'r')
grid
ylabel('P_2')
xlabel('Frequency (Hz)')

如图所示:

Figure contains 2 axes objects. Axes object 1 with title Power Spectrum, ylabel P_1 contains an object of type line. Axes object 2 with xlabel Frequency (Hz), ylabel P_2 contains an object of type line.

        每个信号有三个具有显著能量的频率分量。其中有两个分量似乎是共享分量。使用 findpeaks 求出对应的频率。

[pk1,lc1] = findpeaks(P1,'SortStr','descend','NPeaks',3);
P1peakFreqs = f1(lc1)
P1peakFreqs = 3×1

  165.0391
   35.1562
   94.7266



[pk2,lc2] = findpeaks(P2,'SortStr','descend','NPeaks',3);
P2peakFreqs = f2(lc2)
P2peakFreqs = 3×1

  165.0391
   35.1562
  134.7656

        公共分量位于大约 165 和 35 Hz 处。可以使用 mscohere 直接求出匹配的频率。对相干性估计绘图。找到阈值 0.75 以上的波峰。

[Cxy,f] = mscohere(sig1,sig2,[],[],[],Fs);

thresh = 0.75;
[pks,locs] = findpeaks(Cxy,'MinPeakHeight',thresh);
MatchingFreqs = f(locs)
MatchingFreqs = 2×1

   35.1562
  164.0625


figure
plot(f,Cxy)
ax = gca;
grid
xlabel('Frequency (Hz)')
title('Coherence Estimate')
ax.XTick = MatchingFreqs;
ax.YTick = thresh;
axis([0 200 0 1])

如图所示:

Figure contains an axes object. The axes object with title Coherence Estimate, xlabel Frequency (Hz) contains an object of type line.

        得到的值和以前一样。可以找到两个信号共有的频率成分,而无需分别研究这两个信号。

MATLAB7.x数字信号处理 ex1_1 单位冲激序列 ex1_2 右移20的单位冲激序列 ex1_3 单位阶跃序列 ex1_4 实指数序列 ex1_5 复指数序列 ex1_6 随机序列 ex1_7 系统冲激响应(impz函数) ex1_8 系统传递函数(freqz函数) ex1_9 零极点增益 ex1_10 residuez函数应用 ex1_11 Lattice结构全极点IIR系统 ex1_12 Lattice结构全零点FIR系统 ex1_13 Lattice结构零极点结构 ex2_1 利用Z变换求系统输出 ex2_2 求DFT ex2_3 求序列的圆周移位 ex2_4 求序列的圆周卷积 ex2_5 简单的DFT实例 ex3_2 求系统的阶跃响应 ex3_3 级联型系统结构的参数求解 ex3_4 并联型系统结构的参数求解 ex3_5 求系统频率抽样型结构 ex3_6 全零点性滤波器Lattic结构 ex3_7 全极点性滤波器Lattic结构 ex3_8 零极点性滤波器Lattic结构 ex4_2 用MATLAB作巴特沃斯低通滤波器设计 ex4_3 用MATLAB作切比雪夫-1型低通滤波器设计 ex4_4 切比雪夫-2型低通滤波器设计 ex4_5 椭圆型低通滤波器设计 ex4_6 传递函数的模拟滤波器数字化 ex4_7 脉冲不变法简单实例 ex4_8 脉冲不变法巴特沃思低通滤波器设计 ex4_9 脉冲不变法变换切比雪夫Ⅰ型低通滤波器设计 ex4_10 脉冲不变法变换切比雪夫Ⅱ型低通滤波器设计 ex4_11 脉冲响应不变法椭圆低通滤波器设计 ex4_12 双线性变换巴特沃思低通滤波器设计 ex4_13 双线性变换切比雪夫Ⅰ型低通滤波器设计 ex4_14 双线性变换切比雪夫-2低通滤波器设计 ex4_15 双线性变换椭圆低通滤波器设计 ex4_17 切比雪夫-1高通滤波器设计—ZMAPPING函数的应用 ex4_18 椭圆带通滤波器设计—ELLIP函数的应用 ex4_19 切比雪夫-2带阻滤波器设计—CHEBY2函数的应用 ex4_20 利用Z平面的简单零极点法设计一个高通滤波器 ex5_1 I-型线性相位FIR滤波器 ex5_2 II-型线性相位FIR滤波器 ex5_3 III-型线性相位FIR滤波器 ex5_4 IV-型线性相位FIR滤波器 ex5_5 矩形窗频响 ex5_6 希尔伯特变换器设计-汉宁窗 ex5_7 低通滤波器设计-汉明窗 ex5_8 带通滤波器设计-布莱克曼窗 ex5_9 低通滤波器设计-凯塞窗 ex5_11 频率采样技术:低通,朴素法 ex5_12 频率采样技术:低通, 最优法T1 & T2 ex5_13 频率采样技术:带通, 最优法T1 & T2 ex5_14 频率采样技术:高通, 最优法T1 ex5_15 频率采样技术:差分器 ex5_16 频率采样技术: 希尔伯特变换器 ex5_17 利用Parks-McClella算法设计低通滤波器 ex5_18 用PM算法进行的带通滤波器设计 ex5_19 用PM算法进行的高通滤波器设计 ex5_20 用PM算法进行的阶梯滤波器设计 ex5_21 用PM算法进行的差分器设计 ex5_22 用PM算法进行的希尔伯特变换器设计 ex6_1 ~ ex6_3二项分布的随机数据的产生 ex6_4 ~ ex6_6通用函数计算概率密度函数值 ex6_7 ~ ex6_20常见分布的密度函数 ex6_21 ~ ex6_33随机变量的数字特征 ex6_34 采用periodogram函数来计算功率谱 ex6_35 利用FFT直接法计算上面噪声信号的功率谱 ex6_36 利用间接法重新计算上例中噪声信号的功率谱 ex6_37 采用tfe函数来进行系统的辨识,并与理想结果进行比较 ex6_38 在置信度为0.95的区间上估计有色噪声x的PSD ex6_39 在置信度为0.95的区间上估计两个有色噪声x,y之间的CSD ex6_40 用程序代码来实现Welch方法的功率谱估计 ex6_41 用Welch方法进行PSD估计,并比较当采用不同窗函数时的结果 ex6_42 用Yule-Walker AR法进行PSD估计 ex6_43 用Burg算法计算AR模型的参数 ex6_44 用Burg法PSD估计 ex6_45 比较协方差方法与改进的协方差方法在功率谱估计中的效果 ex6_46 用Multitaper法进行PSD估计 ex6_47 用MUSIC法进行PSD估计 ex6_48 用特征向量法进行PSD估
可以使用 Python 中的 NumPy 和 SciPy 库来生成含有两个不同频率成分信号,并通过滤波实现其分离。具体步骤如下: 1. 导入所需库: ```python import numpy as np from scipy import signal import matplotlib.pyplot as plt ``` 2. 生成两个不同频率成分信号: ```python t = np.linspace(0, 1, 1000, endpoint=False) # 生成时间序列 f1 = 10 # 第一个频率成分 f2 = 20 # 第二个频率成分 x = 0.5 * np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t) ``` 3. 绘制原始信号的时域和频域图像: ```python # 时域图像 plt.subplot(2, 1, 1) plt.plot(t, x) plt.title('Original Signal') plt.xlabel('Time (s)') plt.ylabel('Amplitude') # 频域图像 freqs, psd = signal.welch(x, fs=1000) plt.subplot(2, 1, 2) plt.plot(freqs, psd) plt.title('Power Spectral Density') plt.xlabel('Frequency (Hz)') plt.ylabel('Power') plt.tight_layout() plt.show() ``` 4. 设计带通滤波器,以分离出频率为 20 Hz 的成分: ```python b, a = signal.butter(4, [18, 22], btype='band', fs=1000) y = signal.filtfilt(b, a, x) ``` 5. 绘制滤波后信号的时域和频域图像: ```python # 时域图像 plt.subplot(2, 1, 1) plt.plot(t, y) plt.title('Filtered Signal') plt.xlabel('Time (s)') plt.ylabel('Amplitude') # 频域图像 freqs, psd = signal.welch(y, fs=1000) plt.subplot(2, 1, 2) plt.plot(freqs, psd) plt.title('Power Spectral Density') plt.xlabel('Frequency (Hz)') plt.ylabel('Power') plt.tight_layout() plt.show() ``` 通过以上步骤,我们成功生成了含有两个不同频率成分信号,并通过带通滤波器实现了其分离。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值