【问题标题】:How to generate a lower frequency version of a signal in Matlab?如何在 Matlab 中生成较低频率的信号版本?
【发布时间】:2010-12-01 12:04:24
【问题描述】:

使用正弦输入,我尝试修改它的频率,以削减频谱中的一些较低频率,将主频率移向零。由于信号没有 fftshift,我试图通过在 fft 向量的开头和结尾消除一些样本来做到这一点:

interval = 1;
samplingFrequency = 44100;
signalFrequency = 440;
sampleDuration = 1 / samplingFrequency;
timespan = 1 : sampleDuration : (1 + interval);
original = sin(2 * pi * signalFrequency * timespan);
fourierTransform = fft(original);
frequencyCut = 10; %% Hertz
frequencyCut = floor(frequencyCut * (length(pattern) / samplingFrequency) / 4); %% Samples
maxFrequency = length(fourierTransform) - (2 * frequencyCut);
signal = ifft(fourierTransform(frequencyCut + 1:maxFrequency), 'symmetric');

但它没有按预期工作。我还尝试去除频谱的中心部分,但它也使用了更高频率的正弦波。

如何做到正确?

【问题讨论】:

  • 你可以尝试下采样信号(通过删除样本以较低的速率重新采样)
  • 它可以工作。但这是最好的方法吗?使用 for 循环还是使用特定函数?

标签: math matlab signal-processing frequency fft


【解决方案1】:

@las3rjock:

它更像是对信号本身进行下采样,而不是 FFT .. 看看 downsample

或者您可以创建一个timeseries 对象,然后使用resample 方法对其进行重新采样。

编辑:

一个类似的例子:)

% generate a signal
Fs = 200;
f = 5;
t = 0:1/Fs:1-1/Fs;
y = sin(2*pi * f * t) + sin(2*pi * 2*f * t) + 0.3*randn(size(t));

% downsample
n = 2;
yy = downsample([t' y'], n);

% plot
subplot(211), plot(t,y), axis([0 1 -2 2])
subplot(212), plot(yy(:,1), yy(:,2)), axis([0 1 -2 2])

【讨论】:

  • 我读到这个问题的意思是发帖人想要降低信号的绝对频率,这可以通过对频谱进行下采样和零填充以粗略的方式完成,或者可以更精确地完成通过移动频谱的所需部分。如果对信号进行下采样,实际上会在 DFT 的 -pi 到 pi 相对频率轴上将其频率上移(直到下采样过多并混叠信号)。
  • 看到您的最新编辑后,我认为原始发布者需要澄清他是否想要信号的低通滤波版本(如您的)或降频版本的信号(如我的)。
  • @las3rjock 你是对的,这个信号是 LPF 化的。但我仍然接受他指点我重采样方法的回答=)
  • Resample 方法也对数组进行重新采样,而不仅仅是我所期望的时间戳对象
  • 你说的肯定是信号处理工具箱里的那个
【解决方案2】:

将频谱缩减n 的一种粗略方法是

% downsample by a factor of 2
n = 2; % downsampling factor
newSpectrum = fourierTransform(1:n:end);

要使其成为原始时间轴上的低频信号,您需要在正端和负端将此向量补零至原始长度。使用 fftshift 会更简单:

pad = length(fourierTransform);
fourierTransform = [zeros(1,pad/4) fftshift(newSpectrum) zeros(1,pad/4)];

要恢复降档的信号,请在应用逆变换之前向后移回:

signal = ifft(fftshift(fourierTransform));

编辑:这是一个完整的脚本,它生成一个比较原始信号和降档信号的图:

% generate original signal
interval = 1;
samplingFrequency = 44100;
signalFrequency = 440;
sampleDuration = 1 / samplingFrequency;
timespan = 1 : sampleDuration : (1 + interval);
original = sin(2 * pi * signalFrequency * timespan);

% plot original signal
subplot(211)
plot(timespan(1:1000),original(1:1000))
title('Original signal')

fourierTransform = fft(original)/length(original);

% downsample spectrum by a factor of 2
n = 2; % downsampling factor
newSpectrum = fourierTransform(1:n:end);

% zero-pad the positive and negative ends of the spectrum
pad = floor(length(fourierTransform)/4);
fourierTransform = [zeros(1,pad) fftshift(newSpectrum) zeros(1,pad)];

% inverse transform
signal = ifft(length(original)*fftshift(fourierTransform),'symmetric');

% plot the downshifted signal
subplot(212)
plot(timespan(1:1000),signal(1:1000))
title('Shifted signal')

Plot of original and downshifted signals http://img5.imageshack.us/img5/5426/downshift.png

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多