System response from input and output signals

23 次查看(过去 30 天)
My input is chirp signal .How could i get the frequency response of the sysytem from the output . Using this i want to create a database

采纳的回答

Star Strider
Star Strider 2023-8-21
First, use the System Identification Toolbox (iddata then ssest and compare then lsim) or the Signal Processing Toolbox (invfreqz then filtfilt) to estimate the system and use your chirp function as the input for the simulation.
  12 个评论
suniya vs
suniya vs 2023-8-25
Sir ,There is some harmonics in the system output but it isnit in the simulated output. i want a system that gives similar output.
Star Strider
Star Strider 2023-8-25
编辑:Star Strider 2023-8-25
The harmonics are probably there. You will need to increase the system order beyond 32 to get an accurate representation, although modeling all of them may not be possible. (It turns out that tfest models this system better than ssest, so use tfest instead.)
EDIT — (25 Aug 2023 at 14:37)
Another approach (signal processing) is to use the firls function to approximate the transfer function —
Uz1 = unzip('AliELENvarFsin...b500_8_23.zip')
Uz1 = 1×1 cell array
{'AliELENvarFsin_1K261104b500_8_23.wav'}
Uz2 = unzip('varFsin_1K.zip')
Uz2 = 1×1 cell array
{'varFsin_1K.wav'}
[inpSig,fs]=audioread(Uz2{1});
size_inp = size(inpSig)
size_inp = 1×2
20001 1
fs
fs = 2000
[outSig, Fs] = audioread(Uz1{:});
size_out = size(outSig)
size_out = 1×2
20001 1
Fs
Fs = 2000
L = numel(inpSig);
t = linspace(0, L-1, L)/fs;
[FTs1,Fv] = FFT1(inpSig,t);
[FTs2,Fv] = FFT1(outSig,t);
transfcn = FTs2 ./ FTs1;
figure
plot(Fv, mag2db(abs(transfcn)))
grid
xlabel('Frequency (Hz)')
ylabel('Magnitude (dB)')
title('Transfer Function')
n = 350;
f = Fv(1:end-1);
a = abs(transfcn(1:end-1));
b = firls(n, f/max(f), a);
[hz,fz] = freqz(b, 1, 2^16, Fs);
figure
semilogy(f, a, 'DisplayName','Transfer Function')
hold on
plot(fz, abs(hz), 'DisplayName',["FIR Filter (Order "+string(n)+")"])
hold off
grid
legend('Location','best')
function [FTs1,Fv] = FFT1(s,t)
s = s(:);
t = t(:);
L = numel(t);
Fs = 1/mean(diff(t));
Fn = Fs/2;
NFFT = 2^nextpow2(L);
FTs = fft((s - mean(s)).*hann(L), NFFT)/sum(hann(L));
Fv = linspace(0, 1, NFFT/2+1)*Fn;
Iv = 1:numel(Fv);
FTs1 = FTs(Iv);
end
Use filtfilt to implement the filter.
.

请先登录,再进行评论。

更多回答(0 个)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by