当前位置: 首页 > 知识库问答 >
问题:

利用matlab/octave中的fft和ifft实现信号频率的增减

何飞翰
2023-03-14

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

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

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

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')

共有1个答案

王凌
2023-03-14

很抱歉,下面的内容有点乱。我做每件事都是手动的,因为我不知道还能怎么做。

首先,您需要了解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)是恒定失调(有时称为直流失调)
  • y(2:n/2+1)是正频率的集合
  • y(n/2+2:end)是负频率的集合...通常情况下,我们会在垂直轴左侧绘制此图。
    null

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

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

就这样吧:

 类似资料:
  • 问题内容: 所以,我试图找出如何在实践中使用DFT来检测流行的信号中的频率。我一直在想什么 傅立叶变换和DFT算法是如何工作的,但显然我仍然有路要走。我已经写了一些代码来生成一个信号(自从意图是配合音乐工作,我产生了一个主要的C和弦,因此怪异频率值),然后尝试返回到频率数字。在这里是我的密码吗 这给了我这和我编码的频率(261.63、329.63和392.0)。我做错什么了我该怎么修? 问题答案:

  • MATLAB / Octave These repository is a collection of useful algorithms and data structures built in MATLAB/Octave. In addition you will find solutions from project euler problem sets. The code in this

  • 主要内容:MATLAB vs Octave,以下是纠正/补充内容:GNU Octave是像MATLAB这样的高级编程语言,它能与MATLAB兼容。它也是用于数值计算。 Octave具有以下MATLAB的常见功能 - 矩阵是基本数据类型 它内置了对复杂数字的支持 它具有内置的数学函数和库 它支持用户定义的函数 GNU Octave也是免费的可再分发软件。可以根据自由软件基金会发布的GNU通用公共许可证(GPL)的条款重新分发和/或修改它。 MATLAB vs Oc

  • 问题内容: 我将如何使用Python从WAV PCM文件中读取频率峰值,然后能够生成图像以进行频谱分析? 我正在尝试制作一个程序,使您可以读取任何音频文件,将其转换为WAV PCM,然后查找峰值和频率截止值。 问题答案: Python的wave库将允许您导入音频。之后,您可以使用numpy对音频进行FFT。 然后,matplotlib可以制作出非常漂亮的图表和图形- 绝对可与MATLAB相媲美。

  • 问题内容: 我正在尝试重新实现matlab工具箱之一。他们在那边使用fft。当我对相同的数据执行相同的操作时,我得到的结果与Matlab的结果不同。看看: MATLAB : PYTHON : 如果我弄乱了np.fft.fft()/ np.fft.fft2()/ np.fft.fftn()的参数(轴等),则可以得到的最佳值是相同的,但发生了变化。不幸的是,手动移位不是一种选择,因为Msig矩阵的大小