flowers_mo 2024-12-23 10:28 采纳率: 11.1%
浏览 24
已结题

短时傅里叶变换和短时傅里叶逆变换

clc;
clear all;
close all;

% [s1, fs ] = audioread( 'Thunder5.wav' );
% [s2, fs ] = audioread( 'babble_4.wav' );
% [s3, fs ] = audioread( '123_16.wav' );

% 输入信号
[s1, fs ] = audioread( '2024.12.23.wav' );
[s2, fs ] = audioread( '2024.12.23.1.wav' );
[s3, fs ] = audioread( '2024.12.23.4.wav' );

% 将信号裁剪为1s
 s1 = s1(1:1*fs,:);
 s2 = s2(1:1*fs,:);
 s3 = s3(1:1*fs,:);

%源信号
S = [s1';s2';s3'];

%用来绘制时域图的时间轴横坐标
time = (1:length(s1))/fs; %时间轴
 A = rand(2,3);
%观测矩阵
X = A*S;

%%
% 进行STFT的参数
[m,~] = size(X);
windowlength = 1024;%窗长
nfft = 1024;
d = round(0.15*windowlength)*2;%帧移
overlap = windowlength - d;%重叠数
window = hann(windowlength);
T = size(X,2);
n_frames = fix((T-overlap)/(windowlength-overlap)); % 计算帧数

[stft_x1, f_1, t_1] = stft(X(1,:), fs, 'Window', window, 'OverlapLength', overlap, 'FFTLength', nfft);
[stft_x2, f_2, t_2] = stft(X(2,:), fs, 'Window', window, 'OverlapLength', overlap, 'FFTLength', nfft);

recovered_signals(1,:) = real(istft(stft_x1, 'Window', window, ...
                                        'OverlapLength', overlap, 'FFTLength', nfft));
recovered_signals(2,:) = real(istft(stft_x2, 'Window', window, ...
                                        'OverlapLength', overlap, 'FFTLength', nfft));

为什么使用短时傅里叶变换后直接再使用短时傅里叶逆变换后的信号要比源信号短

img

img

  • 写回答

21条回答 默认 最新

  • 百锦再@新空间 全栈领域优质创作者 2024-12-23 10:34
    关注
    # Gpt辅助回答,我来为你把关

    短时傅里叶变换(STFT)是一种信号处理技术,将信号分成多个短时段,对每个短时段进行傅里叶变换。STFT的逆变换是短时傅里叶逆变换(ISTFT),将经过STFT变换的信号重新合并为原始信号。

    在代码中,首先对信号进行STFT变换得到频谱表示,然后再对频谱进行ISTFT逆变换得到重构的时域信号。但在逆变换的过程中,由于处理过程存在一些损失,使得重构的信号长度可能不完全等于原始信号的长度,导致重构后的信号比原始信号短。

    这种情况通常可以通过在逆变换过程中进行参数调整来解决,如调整重叠数或窗长等。然而,在某些情况下,由于STFT和ISTFT的计算方式,无法完全还原原始信号的长度。这可能会导致重构后的信号比源信号短。

    在实际应用中,可以尝试调整参数或使用其他重构方法来减少信号长度差异。但在某些情况下,这种长度差异可能是无法避免的。


    有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月23日
  • 赞助了问题酬金15元 12月23日
  • 创建了问题 12月23日