Matlab中的傅里叶变换、LTI滤波器和频率响应

Matlab中的傅里叶变换、LTI滤波器和频率响应,matlab,filtering,signal-processing,fft,Matlab,Filtering,Signal Processing,Fft,我是Matlab的LTI信号处理新手,想知道是否有人能帮我做一些我确信是基本的事情。我花了好几个小时研究和获取背景信息,但仍然无法找到解决这些问题的明确途径。到目前为止,我已从头开始生成所需的信号,并设法使用fft函数生成信号的DFT: function x = fourier_rikki(A,t,O) Fs = 1000; t = 0:(1/Fs):1; A = [0.5,0,0.5]; N = (length(A) - 1)/2; x = zeros(size(t)); f1 = 85;

我是Matlab的LTI信号处理新手,想知道是否有人能帮我做一些我确信是基本的事情。我花了好几个小时研究和获取背景信息,但仍然无法找到解决这些问题的明确途径。到目前为止,我已从头开始生成所需的信号,并设法使用fft函数生成信号的DFT:

function x = fourier_rikki(A,t,O)

Fs = 1000;
t = 0:(1/Fs):1;

A = [0.5,0,0.5];
N = (length(A) - 1)/2;
x = zeros(size(t));
f1 = 85;
O1 = 2*pi*f1;

for k = 1:length(A)
x1 = x + A(k)*exp(1i*O1*t*(k-N-1));
end

f2 = 150;
O2 = 2*pi*f2;

for k = 1:length(A);
x2 = x + A(k)*exp(1i*O2*t*(k-N-1));
end

f3 = 330;
O3 = 2*pi*f3;

for k = 1:length(A);
x3 = x + A(k)*exp(1i*O3*t*(k-N-1));
end

signal = x1 + x2 + x3;

figure(1);
subplot(3,1,1);
plot(t, signal);
title('Signal x(t) in the Time Domain');
xlabel('Time (Seconds)');
ylabel('x(t)');

X = fft(signal);  %DFT of the signal

subplot(3,1,2);
plot(t, X);
title('Power Spectrum of Discrete Fourier Transform of x(t)');
xlabel('Time (Seconds)');
ylabel('Power');

f = linspace(0, 1000, length(X)); %?

subplot(3,1,3);
plot(f, abs(X));  %Only want the positive values
title('Spectral Frequency');
xlabel('Frequency (Hz)'); ylabel('Power');

end
在这个阶段,我假设这是正确的:

“使用1000Hz的采样频率生成频率为85150330Hz的信号-绘制信号的1秒值及其离散傅里叶变换。”

下一步是“找到LTI系统的频率响应,该系统使用傅里叶变换滤除较高和较低频率”。我一直在尝试创建一个LTI系统来实现这一点!我必须留下150Hz的信号,我猜我在FFT上执行滤波,可能使用conv

我的课程不是一门编程课程——我们没有对编程技能进行评估,我的Matlab经验也很少——基本上我们只能靠自己的设备来完成,所以我们非常感谢任何帮助!我正在筛选大量不同的示例,并使用“帮助”等搜索Matlab函数,但由于每个示例都不同,并且没有所用变量的细分,因此解释了为什么选择某些参数/值等。这只是增加了混乱

在我看过的许多(许多)其他作品中: 特别是第10.4节。 以及Matlab极客示例和Mathworks Matlab函数说明。 我想最糟糕的情况是没人接电话,我一直盯着看,直到我想出一个办法:)提前谢谢

我发现这个带通滤波器代码是一个Mathworks示例,这正是需要应用于我的fft信号的,但我不了解衰减值Ast或波纹量Ap

n = 0:159;
x = cos(pi/8*n)+cos(pi/2*n)+sin(3*pi/4*n);

d = fdesign.bandpass('Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2',1/4,3/8,5/8,6/8,60,1,60);
Hd = design(d,'equiripple');

y = filter(Hd,x);
freq = 0:(2*pi)/length(x):pi;
xdft = fft(x);
ydft = fft(y);

plot(freq,abs(xdft(1:length(x)/2+1)));
hold on;
plot(freq,abs(ydft(1:length(x)/2+1)),'r','linewidth',2);
legend('Original Signal','Bandpass Signal');

这里有一些你可以参考的东西。我想我知道你想做什么的要点了。如果你有任何问题,请告诉我

clear all
close all

Fs = 1000;
t = 0:(1/Fs):1;
N = length(t);

% 85, 150, and 330 Hz converted to radian frequency
w1 = 2*pi*85;
w2 = 2*pi*150;
w3 = 2*pi*330;

% amplitudes
a1 = 1;
a2 = 1.5;
a3 = .75;

% construct time-domain signals
x1 = a1*cos(w1*t);
x2 = a2*cos(w2*t);
x3 = a3*cos(w3*t);

% superposition of 85, 150, and 330 Hz component signals
x = x1 + x2 + x3; 

figure
plot(t(1:100), x(1:100));
title('unfiltered time-domain signal, amplitude vs. time');
ylabel('amplitude');
xlabel('time (seconds)');

% compute discrete Fourier transform of time-domain signal
X = fft(x); 
Xmag = 20*log10(abs(X)); % magnitude spectrum
Xphase = 180*unwrap(angle(X))./pi; % phase spectrum (degrees)
w = 2*pi*(0:N-1)./N; % normalized radian frequency
f = w./(2*pi)*Fs; % radian frequency to Hz
k = 1:N; % bin indices 

% plot magnitude spectrum
figure
plot(f, Xmag)
title('frequency-domain signal, magnitude vs. frequency');
xlabel('frequency (Hz)');
ylabel('magnitude (dB)');

% frequency vector of the filter. attenuates undesired frequency components
% and keeps desired components. 
H = 1e-3*ones(1, length(k));
H(97:223) = 1;
H((end-223):(end-97)) = 1;

% plot magnitude spectrum of signal and filter
figure
plot(k, Xmag)
hold on
plot(k, 20*log10(H), 'r')
title('frequency-domain signal (blue) and filter (red), magnitude vs. bin index');
xlabel('bin index');
ylabel('magnitude (dB)');

% filtering in frequency domain is just multiplication
Y = X.*H;

% plot magnitude spectrum of filtered signal
figure
plot(f, 20*log10(abs(Y)))
title('filtered frequency-domain signal, magnitude vs. frequency');
xlabel('frequency (Hz)');
ylabel('magnitude (dB)');

% use inverse discrete Fourier transform to obtain the filtered time-domain
% signal. This signal is complex due to imperfect symmetry in the
% frequency-domain, however the imaginary components are nearly zero.
y = ifft(Y);

% plot overlay of filtered signal and desired signal
figure
plot(t(1:100), x(1:100), 'r')
hold on
plot(t(1:100), x2(1:100), 'linewidth', 2)
plot(t(1:100), real(y(1:100)), 'g')
title('input signal (red), desired signal (blue), signal extracted via filtering (green)');
ylabel('amplitude');
xlabel('time (seconds)');
这是最终的结果。。。

听起来像是要求您绘制150 Hz陷波滤波器的频率响应。如果你想在频域进行滤波,你可以把所有的箱子归零,除了两个包含+150赫兹和-150赫兹分量的箱子。这相当于将原始信号的FFT乘以一个频率向量(滤波),该频率向量的二进制位中有一个对应于+150 Hz和-150 Hz,其他位置为零。感谢David的回复,这正是我们需要做的。我不知道如何建立一个频率向量,但会研究。还发现了一种带通设计:“n=0:159;x=cos(pi/8*n)+cos(pi/2*n)+sin(3*pi/4*n);d=F设计带通('Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2',1/4,3/8,5/8,6/8,60,1,60);Hd=设计(d,'等波纹');y=过滤器(Hd,x);freq=0:(2*pi)/长度(x):pi;xdft=fft(x);ydft=fft(y);绘图(频率、绝对值(xdft(1:长度(x)/2+1));等等绘图(频率、绝对值(ydft(1:length(x)/2+1))、'r'、'linewidth',2);图例('原始','带通');'虽然我不明白fdesign.bandpass输入是你的阻带衰减,Ap是你的通带波纹。这些是用于指定过滤器要求的常用设计参数。但我认为你不想走这条路,这只会让事情复杂化。相反,你应该在频域中进行滤波,因为你已经有了DFT。由于线性比例,滤波器看起来只是平直的,如果你放大,你会看到它不是平直的。关于你的第二个问题,文本似乎被删掉了。哇。这真是太酷了-如此简洁的代码!非常感谢大卫,我几乎百分之百地理解它。只有几个问题:1。如果我将20log10乘法到处移除(即不转换为分贝),信号和滤波器图的幅度谱将滤波器显示为一条平线。但如果我再把滤波器分量H乘以20log10,在绘图时,它就会显示出来。我可能遗漏了什么,但你知道为什么会这样吗?2.为什么初始频率向量H必须乘以1e-3?再次感谢你,你的帮助出乎意料!!啊,是的,我现在看到了!是的,我还没有完成——对不起!