在matlab中绘制短时傅立叶变换(注意窗口大小和步长)

时间:2014-06-04 18:19:09

标签: matlab signal-processing audio

需要帮助,因为有点丢失。我试图绘制下面的代码,我在其中制作了白噪声并使用STFT进行带通滤波,但现在我需要将信号绘制成每个通道的两个图形。结果应该是图表。对于图1a。,水平轴应为频率,垂直轴应为幅度。对于(2).b,横轴应为时间,纵轴应为频率,并使用颜色表示幅度。

function newwhitenoise()
L = 5000; %Sample length for the random signal
Pause = 10000; %Sample Pause Gap
mu = 0;
sigma = 2;

%Need to see left signal is not displaying
Left_signal = sigma*randn(L,1) + mu;
Right_signal = sigma*randn(L,1) + mu;

Long_signal = [Left_signal zeros(L,1); zeros(Pause,2); zeros(L,1) Right_signal];

%Player Object
soundRecord(Long_signal);


disp([Left_signal zeros(L,1)]);
%sound(Long_signal, Fs);

%Plots subplots in graph
%figure
%subplot(211);
%plot(Left_signal, 'b'); grid on;
%subplot(212);
%plot(Right_signal, 'r'); grid on;
end

function signalplayer(signal)
    %load(signal);
    fs = 44100; %Sample Frequency
    obj = audioplayer(signal,fs);
    play(obj);
end

function soundRecord (signal)
fs = 44100; %Sample Frequency
recObj = audiorecorder(44100, 16, 2);
get(recObj)

%save sound to wave file
%filename = 'location.flac';
audiowrite('input.wav',signal, fs);


if ~exist('inFile')
    inFile = 'input.wav';
end

if ~exist('outFile')
    outFile = 'output.wav';
end

if ~exist('frameWidth')
    frameWidth = 4096;          % size of FFT frame, better be a power of 2
end
frameHop = frameWidth/2;

analWindow = hanning(frameWidth);

[inBuffer, Fs] = wavread(inFile);

x = [inBuffer(:,1); linspace(0, 0, frameWidth)'];                   % use left channel only, zeropad one frame at the end

clear inBuffer;

numSamples = length(x);

numFrames = floor(numSamples/frameHop)-1;

% disp(frameWidth);
% disp(numSamples);
% disp(frameHop);
% disp(numFrames);
% disp(size(analWindow));
% disp(size(transpose(analWindow)));

y = linspace(0, 0, numSamples)';


n = 0;                              % init sample pointer.  unlike MATLAB, i like counting from 0

for frameIndex = 1:numFrames

     xWindowed = x(n+1:n+frameWidth) .* analWindow;     % get and window the input audio frame

     X = fft(fftshift(xWindowed));              % do the FFT

     Y = X;                         % copy the input spectrum to output

                                % do whatever processing to Y that you like

     yWindowed = fftshift(real(ifft(Y)));           % convert back to time domain, toss the imaginary part
 %disp(size(x(1:frameWidth)));
 %disp(size(yWindowed));

     y(n+1:n+frameWidth) = y(n+1:n+frameWidth) + yWindowed;

     n = n + frameHop;
end

wavwrite(y, Fs, 'output.wav');

1 个答案:

答案 0 :(得分:0)

对于图表1,请尝试pwelch,对于图表2,请尝试spectrogram pwelch基本上是STFT平方幅度的平均值。 spectrogram函数返回信号的STFT,因此它对时域中的信号进行操作 使用相同的输入参数调用这两个函数,并且在没有输出的情况下调用时,将结果绘制在当前轴上 如果您希望频率轴为图2中的垂直轴(y),请在'yaxis'的调用中使用选项spectrogram。我建议你查看两个函数的文档。