我知道我可以通过改变可变转变的整数改变频率,但我怎样才能改变频率使用数字与小数像0.754或1.2345或67.456。如果我改变可变“转移”到非整像数等5.1我得到一个错误标索引必须是正整数小于2 ^从管线mag2s = [MAG2 31或逻辑值(移+1:结束),零(1,移位)];从问题increase/decrease the frequency of a signal using fft and ifft in matlab/octave不断变化的变量转变作品(只是到整数的作品,我需要它带有小数数字也工作)以下使用FFT和IFFT改变频率不使用整数
示例代码。
PS:我使用八度3.8.1这就好比是MATLAB和我知道我可以通过在变量调整式改变频率雅但亚将来自音频源取的信号(人类的言语),所以它不会是一个等式。该等式仅用于保持示例简单。而且Fs很大,因为使用的信号文件大约45秒长,这就是为什么我不能使用resample,因为使用时出现内存不足错误。
这里是一个动画YouTube视频的例子,当我使用测试方程时,我想要得到的结果ya = .5 * sin(2 * pi * 1 * t)+。2 * cos(2 * pi * 3 * t)和我试图发生什么,如果我改变变量转变从(0:0.1:5)youtu.be/pf25Gw6iS1U请记住,雅将是一个导入的音频信号,所以我不会有一个方程容易地调整
clear all,clf
Fs = 2000000;% Sampling frequency
t=linspace(0,1,Fs);
%1a create signal
ya = .5*sin(2*pi*2*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 = 5; % 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);
yafft2 = x + i*y; % store signal as complex numbers
yaifft2 = real(ifft(yafft2)); % take inverse fft
plot(t,ya,'-r',t,yaifft2,'-b'); % time signal with increased frequency
legend('Original signal (ya) ','New frequency signal (yaifft2) ')
我不知道你在问什么。通过移位该信号的频移已经(可能)是非整数。傅里叶域中采样间隔为2 * Nyquist/N(其中N是采样总数)。如果你想要更接近的间距,你可以填充你的输入信号。 – efunkh
@efunkh我知道我可以通过改变变量'shift'来改变整个数字的频率,但我怎样才能改变频率使用小数位数字如0.754或1.2345或67.456。如果我将变量'shift'更改为像5.1这样的非整体,我会得到一个错误下标index必须是小于2^31的正整数或逻辑 –
我还添加了错误来自的行 –