clear, clc, close all
%% example1
% 音频信号处理实例
% [x, fs] = audioread('track.wav'); % 微软开机声音
% x = x(:, 1);
% xlen = length(x);
%
% t = (0:xlen-1)/fs;
%
% wlen = 2^9; % 窗函数宽度取 2^9
% hop = wlen/4;
% nfft = 4*wlen;
% % win = window(@blackman,wlen);
% win = blackmanharris(wlen, 'periodic');
% %% FFT
% figure(NumberTitle="off",Name="音频信号频域图像");
% X = fft(x,nfft);
% f = linspace(-fs/2,fs/2,nfft);
% plot(f,abs(X))
% xlabel("频率f"); ylabel("幅度A"); title('音频信号频域图像')
% %% STFT
% [S1, f1, t1] = stft(x, fs, 'Window', win, 'OverlapLength',wlen - hop,'FFTLength',nfft);
% figure(NumberTitle="off",Name="时频分析图");
% PlotSTFT(t1, f1, S1);
%% example2
% chirp信号仿真
T = 100e-9; B = 77e9; fs = 4*B; c = 3e8;
N = round(T*fs);
t = linspace(0,T,N);
f = linspace(-fs/2,fs/2,N);
k = B/T;
% chirp 信号定义
chirp = exp(1i*pi*k*t.^2);
% 发射信号绘制
% figure(NumberTitle="off",Name='chirp信号绘制')
% subplot(2,1,1)
% plot(t.*1e9,real(chirp));
% xlabel('时间 ns'); ylabel('幅度'); title('chirp 信号 时域')
% subplot(2,1,2)
% plot(f./1e9,fftshift(abs(fft(chirp)/N)))
% xlabel('频率 MHz'); ylabel('幅度'); title('chirp 信号 频域')
% 增加目标
R = [1 5 10];
Sr = zeros(1,N);
delta_t = 2*R/c;
for i = 1:length(R)
Sr = Sr + exp(1i*pi*k*(t - delta_t(i)).^2);
end
Sr = chirp .* conj(Sr);% 匹配滤波
% 接收回波
figure(NumberTitle="off",Name='接收回波')
subplot(3,1,1)
plot(t.*1e9,real(Sr))
xlabel('时间 ns'); ylabel('幅度'); title('接收信号 时域')
dsit = f*c*T/2/B;
subplot(3,1,2)
plot(dsit,fftshift(abs(fft(Sr)/N)))
xlabel('距离 m'); ylabel('幅度'); title('接收信号 距离图')
subplot(3,1,3)
plot(f./1e9,fftshift(abs(fft(Sr)/N)))
xlabel('频率 MKz'); ylabel('幅度'); title('接收信号 频域')
%% STFT
%==========================================================================
% 满足 Constant OverLap-Add STFT
wlen = 2^8;
noverlap = wlen/2; % 步长为窗的长度
% 构造满足 Constant OverLap-Add 长度矩阵
y = zeros(1,wlen - mod(N,noverlap) + N);
y(1:N) = Sr;
% 增加点数后信号参数:
N1 = length(y); T1 = N1/fs;
filter_win = zeros(1,N1); % 初始化窗矩阵
% win = hann(wlen,'periodic');
win = hamming(wlen);
loop = (N1 - wlen)/noverlap;
for i = 0:loop
filter_win(1 + i*noverlap:wlen + i*noverlap) = filter_win(1 + i*noverlap:wlen + i*noverlap) + win';
end
tt = linspace(0,T1,N1);
figure(NumberTitle="off",Name='采样点序列 wlen=N/2 时的COLA验证')
plot(tt.*1e9,filter_win)
xlabel('时间 ns'); ylabel('幅度'); title('采样点序列')
%==========================================================================
% STFT
nfft = length(y);
[S1, f1, t1] = stft(y, fs, 'Window', win, 'OverlapLength', noverlap, 'FFTLength',nfft);
figure(NumberTitle="off",Name="时频分析图");
PlotSTFT(t1, f1, S1);
%% STFT信号重构
x2 = istft(S1,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',nfft);
figure(NumberTitle="off",Name='STFT信号重构 istft函数')
plot(tt.*1e9,real(x2))
xlabel('时间 ns'); ylabel('幅度'); title('重构序列')
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
该资源为MATLAB实现短时傅里叶变换(STFT)及其相关应用。该资源还包括STFT的可视化、瞬时频率计算等高级主题,适合从初学者到进阶用户的不同学习需求。 包含的函数实例: 基础STFT函数:一个简单的STFT MATLAB函数,易于理解和修改。 STFT绘制函数:介绍如何在MATLAB中绘制STFT的结果,包括时间-频率表示和谱图。 瞬时频率计算:展示如何利用STFT结果计算信号的瞬时频率。 多个实例内容:包括不同类型信号(如音频信号、振动信号等)的STFT分析,以及如何解释和利用这些分析结果。 这份资源适合所有对信号处理感兴趣的学生、研究人员和工程师,特别是那些希望通过MATLAB深入了解和应用短时傅里叶变换的人员。无论是信号处理的初学者还是有一定经验的专家,都能从中获益。 有关资源的任何问题,请评论区回复!欢迎所有用户分享自己的疑问、经验和见解,共同促进学习和探索的氛围。无论是遇到具体的编程问题,还是对理论概念有所疑惑,都可以在这里找到帮助和支持。
资源推荐
资源详情
资源评论
收起资源包目录
InstFreq.zip (6个子文件)
track.wav 415KB
PlotSTFT.m 453B
STFT.m 1KB
istft.m 2KB
InstFreq.m 3KB
example.m 3KB
共 6 条
- 1
资源评论
晨晨丶
- 粉丝: 1830
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功