我知道我可以通過改變可變轉變的整數改變頻率,但我怎樣才能改變頻率使用數字與小數像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的正整數或邏輯 –
我還添加了錯誤來自的行 –