- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想改变频域中信号的相位。所以我生成了一个余弦测试信号来验证代码:
ycheck = cos(2*pi*t);
当我想改变关于 pi/4 的相位时,我对信号执行 fft 将其分成幅度和相位,然后从中减去 pi/4。
Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift
绘制结果看起来只有信号的幅度降低了,但没有发生相移。我在论坛上做了一些研究,发现了这篇文章 Change phase of a signal in frequency domain (MatLab) 。所以我使用以下方法生成了另一个测试信号:
y = exp(1i*2*pi*t);
当我用这个信号做相移时,它给出了想要的结果。遗憾的是我不能发布图片 :(,所以我尝试描述(附上代码,所以你可以执行它):只有想象项的 ifft 被正确移动。标准余弦的 ifft 仅在幅度上降低。我不太明白,这里有什么问题。
我的问题是,为什么相移对以虚数项表示的信号起作用,而不对规则生成的余弦起作用?我的计划是将此相移应用于实际信号 - 我可以将频域中的相移应用于例如音乐信号还是有另一种(也许更聪明)的方式?
我的代码在这里:
clear all;
close all;
clc;
N = 64; %number of samples
fs = 10; %sampling frequency
ts = 1/fs; %sample interval
tmax = (N-1)*ts;
t = 0:ts:tmax;
y = exp(1i*2*pi*t);
ycheck = cos(2*pi*t);
% plot test signals
figure
plot(t,y)
hold on
plot(t,ycheck,'r--')
% fft
Y = fft(y);
Ycheck = fft(ycheck);
% phase shift
Y = abs(Y).*exp(1i*angle(Y)-1i*pi/4); % -pi/4 shift
Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift
%ifft
u = ifft(Y);
ucheck = ifft(Ycheck);
% plot
figure
plot(t,real(u),'k')
hold on
plot(t,real(y),'r')
hold on
plot(t,real(ucheck),'g')
hold on
plot(t,ycheck,'b--')
legend('ifft(exp(1i*2*pi*t)) %-pi/4shift','real(cos(2*pi*t))','ifft(cos(2*pi*t)) %-pi/4 shift','cos(2*pi*t)')
最佳答案
有趣的问题!
如您所知,余弦可以表示为两个虚指数之和:
cos(x) = ( exp(1i*x) + exp(-1i*x) ) / 2;
改变余弦的相位意味着向余弦参数 x
添加一个数字,例如 phi
:
cos(x+phi) = ( exp(1i*(x+phi)) + exp(-1i*(x+phi)) ) / 2;
也就是说,
cos(x+phi) = ( exp(1i*x + 1i*phi) + exp(-1i*x - 1i*phi) ) / 2;
因此,您需要在一个指数中添加 1i*phi
并在另一个指数中减去 1i*phi
。在你的情况下 phi = -pi/4
。然而,你的行
Ycheck = abs(Ycheck).*exp(1i*angle(Ycheck)-1i*pi/4); % -pi/4 shift
将相同项添加到两个指数(实际上,添加到所有频率分量)。这就是问题所在。
在普通的傅里叶变换中,第一个指数对应于变换域中的正频率,第二个指数对应于负频率。但由于您正在进行 DFT (FFT),负频率会折叠并出现在上部。因此,您需要在 DFT 的下半部分添加 phi
并在上半部分减去 phi
。
假设DFT的点数是偶数,如你的例子,你只需要将上面指示的线替换为
phi = -pi//4; %/ desired phase shift
ind = 1:numel(Ycheck)/2; %// lower half
Ycheck(ind) = abs(Ycheck(ind)).*exp(1i*angle(Ycheck(ind))+1i*phi); %// add 1i*phi
ind = numel(Ycheck)/2+1:numel(Ycheck); %// upper half
Ycheck(ind) = abs(Ycheck(ind)).*exp(1i*angle(Ycheck(ind))-1i*phi); %// subtract 1i*phi
关于matlab - 在频域中改变信号的相位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584434/
下面是比较 fft 相位图与 2 种不同方法的代码: import numpy as np import matplotlib.pyplot as plt import scipy.fftpack p
我使用 apache commons 数学库来转换我的音频样本缓冲区上的 FFt 和 IFFT。 FFT 的输出给了我一组复数。频率在中间镜像。样本缓冲区大小为 4096 个样本,我得到 2048 个
我是一名优秀的程序员,十分优秀!