fs = 10000; % 采样率 t = 0:1/fs:1-1/fs; % 时间轴 f1 = 1000; % 1KHz f2 = 2000; % 2KHz f3 = 3000; % 3KHz x1 = sin(2*pi*f1*t); % 1KHz正弦信号 x2 = sin(2*pi*f2*t); % 2KHz正弦信号 x3 = sin(2*pi*f3*t); % 3KHz正弦信号 x = x1 + x2 + x3; % 三个正弦信号混合 noise = 0.1*randn(size(x)); % 高斯白噪声 mixed_signal = x + 10*noise; % 正弦信号和高斯白噪声混合 x = mixed_signal; fpass = [1900 2100]; % 通带频率范围 order = 100; % 滤波器阶数 b = fir1(order, fpass/(fs/2), 'bandpass'); % 设计滤波器 filtered_signal = filter(b, 1, mixed_signal); % 混合信号通过滤波器后只剩下2KHz频率的信号 N = length(x); % 信号长度 X = fft(x)/N; % 原始信号频谱 f = (0:N-1)*(fs/N); % 频率轴
时间: 2023-06-14 21:05:31 浏览: 133
subplot(2,2,1); plot(t,x); title('混合信号'); xlabel('时间 (s)'); ylabel('幅值');
subplot(2,2,2); plot(f,abs(X)); title('混合信号频谱'); xlabel('频率 (Hz)'); ylabel('幅值');
subplot(2,2,3); plot(t,filtered_signal); title('滤波后信号'); xlabel('时间 (s)'); ylabel('幅值');
Y = fft(filtered_signal)/N; % 滤波后信号频谱
subplot(2,2,4); plot(f,abs(Y)); title('滤波后信号频谱'); xlabel('频率 (Hz)'); ylabel('幅值');
在上面的代码中,我们首先生成三个不同频率的正弦信号,并将它们混合在一起,同时加入高斯白噪声。然后我们设计一个带通滤波器,将通带频率设置为1900Hz到2100Hz之间,滤波器阶数为100。混合信号通过滤波器后,只剩下2KHz频率的信号。最后我们绘制原始信号和滤波后信号的时域波形和频域波形。
相关问题
分析此代码运行结果:% 生成原始信号 fs = 1000; % 采样率 t = 0:1/fs:1-1/fs; % 时间向量 f1 = 50; % 第一个正弦波频率 f2 = 200; % 第二个正弦波频率 x = sin(2*pi*f1*t) + sin(2*pi*f2*t); % 原始信号 % 设计带通滤波器 fp1 = 125; % 通带下限频率 fp2 = 300; % 通带上限频率 wp1 = fp1/(fs/2); % 归一化通带下限频率 wp2 = fp2/(fs/2); % 归一化通带上限频率 N = 30; % 滤波器阶数 b = fir1(N, [wp1, wp2], 'bandpass', hamming(N+1)); % 汉明窗函数加权 % 滤波 y = filter(b, 1, x); % 绘制原始信号和滤波后的信号 figure; subplot(2,1,1); plot(t,x); title('原始信号'); xlabel('时间 (s)'); ylabel('幅度'); subplot(2,1,2); plot(t,y); title('滤波后信号'); xlabel('时间 (s)'); ylabel('幅度');
这段代码的作用是生成一个由两个正弦波组成的原始信号,并使用带通滤波器将该信号中的125Hz到300Hz之间的频率成分滤出来,并绘制出原始信号和滤波后的信号。
具体分析如下:
1. 生成原始信号
首先,通过设定采样率为1000Hz和时间向量,生成了1秒钟的时间序列。然后,设定两个正弦波的频率为50Hz和200Hz,并将它们相加,生成了一个由两个正弦波组成的原始信号。
2. 设计带通滤波器
接下来,通过设定通带下限频率为125Hz,通带上限频率为300Hz,将这两个频率归一化到采样率的一半(即500Hz),并设定滤波器阶数为30,使用fir1函数设计了一个带通滤波器。在这个函数中,使用了汉明窗函数对频率响应进行了加权,以增强滤波器的性能。
3. 滤波
使用filter函数对原始信号进行滤波,得到了滤波后的信号。在这个函数中,将滤波器系数b和原始信号x输入,同时将1作为第二个参数(即滤波器的分母),表示使用直接I型结构进行滤波。
4. 绘制图像
最后,使用subplot函数将两个子图分别绘制在一个图像窗口中,分别显示原始信号和滤波后的信号。在绘制时,使用plot函数绘制出时间序列和幅度之间的关系,并使用title、xlabel和ylabel函数添加标题和坐标轴标签。
总之,该代码实现了一个简单的带通滤波器,并使用该滤波器对一个由两个正弦波组成的原始信号进行了滤波。
以1秒的滑动窗口生成重叠度为80%的chirp信号的python代码
以下是以1秒的滑动窗口生成重叠度为80%的chirp信号的Python代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
# 设置chirp信号的参数
fs = 44100 # 采样频率
T = 10 # 信号总时长
f0 = 100 # 起始频率
f1 = 1000 # 终止频率
t = np.linspace(0, T, int(fs*T)) # 时间轴
k = (f1-f0)/T # 调频率
# 生成初始的chirp信号
x = np.sin(2*np.pi*(f0*t + 0.5*k*t**2))
# 以1秒的时间间隔滑动窗口生成新的chirp信号
window_size = fs # 窗口大小为1秒
overlap_size = int(window_size*0.8) # 重叠大小为0.8秒
hop_size = window_size - overlap_size # 步长为0.2秒
num_windows = int(np.ceil(float(len(x))/hop_size))
chirp_signals = np.zeros((num_windows, window_size))
for i in range(num_windows):
start = i*hop_size
end = start + window_size
if end > len(x):
end = len(x)
chirp_signals[i,:end-start] = x[start:end]
# 对于每个新的chirp信号,与前一个窗口内的信号进行重叠
for i in range(1, num_windows):
previous_signal = chirp_signals[i-1, overlap_size:]
current_signal = chirp_signals[i, :window_size-overlap_size]
overlap = previous_signal[-overlap_size:] + current_signal[:overlap_size]
weight = np.linspace(0, 1, overlap_size)
chirp_signals[i,:overlap_size] = weight*overlap + (1-weight)*previous_signal[-overlap_size:]
chirp_signals[i,:window_size-overlap_size] += current_signal[overlap_size:]
# 将每个窗口内的信号数组相加,得到完整的重叠度为80%的chirp信号
chirp_signal = np.concatenate(chirp_signals)
# 绘制chirp信号的图像
plt.plot(t, chirp_signal)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()
```
需要注意的是,由于窗口滑动时需要进行大量的计算,因此在处理长时间的信号时可能需要一定的时间。为了加快处理速度,可以考虑使用并行计算等技术。