Я знаю, что могу изменить частоту целыми числами, изменив переменную shift, но как я могу изменить частоту, используя числа с десятичными разрядами, например 0,754 или 1,2345 сильный> или 67,456. Если я изменяю переменную 'shift' на нецелое подобное число, такое как 5.1 , я получаю сообщение об ошибке: индексы нижнего индекса должны быть положительными целыми числами меньше 2^31 или логические операции из строки mag2s = [mag2(shift+1:end), zeros(1,shift)];
Пример кода ниже из вопроса >увеличение/уменьшение частоты сигнала с помощью fft и ifft в матлабе/октаве работает с изменением переменной shift (но работает только с целыми числами, мне нужно чтобы также работать с десятичными числами).
PS: я использую октаву 3.8.1, похожую на Matlab, и я знаю, что могу изменить частоту, изменив формулу в переменной ya, но ya будет сигналом взято из источника звука (человеческая речь), поэтому это не будет уравнением. Уравнение используется просто для упрощения примера. И да, Fs велик из-за того, что используемые файлы сигналов имеют длину около 45 секунд, поэтому я не могу использовать ресемплинг, потому что при использовании я получаю сообщение об ошибке нехватки памяти.
Вот анимированный пример видео на YouTube того, что я пытаюсь получить, используя тестовое уравнение ya= .5*sin(2*pi*1*t)+.2*cos(2*pi*3*t) и что я пытаюсь получить, если я изменю переменную shift от (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) ')