【问题标题】:increase / decrease the frequency of a signal using fft and ifft in matlab / octave在matlab / octave中使用fft和ifft增加/减少信号的频率
【发布时间】:2015-02-27 00:09:51
【问题描述】:

我正在尝试使用 fft 和 ifft 增加/减少信号的频率。第一个图是1hz,第二个图是2hz,我试图通过改变fft和ifft值来获得

我可以在频域和时域之间切换,但是如何使用 fft / ifft 增加或减少信号的频率?

注意:是的,我知道我可以通过改变方程式的频率值来改变频率,但我只是将其用作测试信号。我将使用的信号没有将被导入的方程。

我想通过调整 fft 和 ifft 值来获得 2hz 的图

示例代码如下:

clear all,clf

Fs = 100;% Sampling frequency
t=linspace(0,1,Fs);

%1a create signal
ya = .5*sin(2*pi*1*t); 

%2a create frequency domain
ya_fft = fft(ya);

mag = abs(ya_fft);
phase = unwrap(angle(ya_fft));
ya_newifft=ifft(mag.*exp(i*phase));

%3a frequency back to time domain
ya_ifft=real(ifft(ya_fft));

%1b time domain plot
subplot(2,2,1),plot(t,ya)
title('1 Orginal Signal Time domain')
ylabel('amplitude')
xlabel('Seconds')

%2b frequency domain plot.
[xfreq,yamp]=rtplotfft(ya,Fs);
yamp2=(yamp(:,1)/max(abs(yamp(:,1)))*1); %keep at 1, amplitude levels adjustied in loop below
subplot(2,2,2),plot(xfreq,yamp) 
title('2 Frequency domain')
xlabel('Frequency (Hz)')
ylabel('amplitude')

Ps:我使用的是 octave 3.8.1,它适用于 matlab

【问题讨论】:

  • 您是否知道频域中的水平移动对应于时域中的频率变化?例如,将函数的 FFT 滑动 +50Hz 会将该函数的频率增加 50Hz。
  • @eigenchris - 我正要提到这一点。 +1 为您的评论。 Rick T - 为什么不简单地将所有频率分量转换为正数?
  • @eigenchris 我尝试改变频域线 ya_fft = fft(ya);通过添加 1 和 2。我还尝试更改行中的相位 phase = unwrap(angle(ya_fft));这不会创建第二个情节我在您的评论中遗漏了什么吗?

标签: matlab fft octave ifft


【解决方案1】:

抱歉,以下内容有点混乱。我手动完成了所有操作,因为我不知道该怎么做。

首先您需要了解 MATLAB 如何存储频域数据。举个例子:

N = 100;            % number of samples
Fs = 100;           % sampling frequency
f = 5;              % frequency of the signal
t = 0:1/N:1-1/N;    % time goes from 0 to 1 second 
y = cos(2*pi*f*t);  % time signal
Y = fft(y);         % frequency signal

figure(1); plot(y);
figure(2); plot(abs(Y));
  • Y(1) 是常量偏移量(有时称为 DC 偏移量)
  • Y(2:N/2 + 1) 是一组正频率
  • Y(N/2 + 2:end) 是一组负频率...通常我们会在垂直轴的 left 处绘制。

请注意,因为N=100 是偶数,所以会有50 正频率分量和49 负频率分量。如果N 是奇数,则正负频率的数量相等。

如果我们想增加频率,我们需要做的是:

  • 进行傅里叶变换
  • 保持直流偏移不变
  • 将频谱的正部分向右移动
  • 将频谱的负部分向左移动

为了降低频率,我们只需反转移位的方向。

在你的情况下,你需要做的是......

clear all,clf

Fs = 100;% Sampling frequency
t=linspace(0,1,Fs);

%1a create signal
ya = .5*sin(2*pi*1*t); 

%2a create frequency domain
ya_fft = fft(ya);

mag = abs(ya_fft);
phase = unwrap(angle(ya_fft));
ya_newifft=ifft(mag.*exp(i*phase));

% ----- changes start here ----- %

shift   = 1;                            % shift amount
N       = length(ya_fft);               % number of points in the fft
mag1    = mag(2:N/2+1);                 % get positive freq. magnitude
phase1  = phase(2:N/2+1);               % get positive freq. phases
mag2    = mag(N/2+2:end);               % get negative freq. magnitude
phase2  = phase(N/2+2:end);             % get negative freq. phases

% pad the positive frequency signals with 'shift' zeros on the left
% remove 'shift' components on the right
mag1s   = [zeros(1,shift) , mag1(1:end-shift)];
phase1s = [zeros(1,shift) , phase1(1:end-shift)];

% pad the negative frequency signals with 'shift' zeros on the right
% remove 'shift' components on the left
mag2s   = [mag2(shift+1:end), zeros(1,shift)];
phase2s = [phase2(shift+1:end), zeros(1,shift) ];

% recreate the frequency spectrum after the shift
%           DC      +ve freq.   -ve freq.
magS    = [mag(1)   , mag1s     , mag2s];
phaseS  = [phase(1) , phase1s   , phase2s];


x = magS.*cos(phaseS);                  % change from polar to rectangular
y = magS.*sin(phaseS);
ya_fft2 = x + i*y;                      % store signal as complex numbers
ya_ifft2 = real(ifft(ya_fft2));         % take inverse fft

plot(t,ya_ifft2);                       % time signal with increased frequency

你去吧:

【讨论】:

  • 多哈。我也忘了提到单独留下直流分量。不错的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2015-07-28
相关资源
最近更新 更多