pkg load signal % Параметры frame_background_gray = true ; if frame_background_gray graphics_toolkit ( "qt" ) % or graphics_toolkit("fltk") frame_background = .94 * [ 1 1 1 ]; d = 4 ; % количество для добавления к размерам текста ds = 8 ; % количество для размера маленького маркера dl = 12 ; % количество для размера большого маркера else graphics_toolkit ( "gnuplot" ) % фон будет белым независимо от значения ниже frame_background = .94 * [ 1 1 1 ]; d = 0 ; ds = 0 ;; dl = 0 endif % (https://octave.org/doc/v4.2.1/Graphics-Object-Properties.html#Graphics-Object-Properties) % Ускорение работы при использовании Gnuplot set ( 0 , "DefaultAxesFontsize" , 10 + d ) set ( 0 , "DefaultTextFontsize" , 12 + d ) set ( 0 , "DefaultAxesYlim" ,[ - 2 2 ]) set ( 0 , "DefaultAxesYtick" ,[]) set ( 0 , " DefaultAxesXtick" ,[]) set ( 0 , "DefaultFigureColor" , frame_background ) set ( 0 , "DefaultAxesColor" , "white" ) %====================================================== samples_per_DFT = 64 ; DFT_display_bins = samples_per_DFT / 2 ; samples_per_DTFT = 1024 ; Hz_per_bin = 1 ; % Установить интервал между бинами DFT на 1 Гц samples_per_sec = Hz_per_bin * samples_per_DFT ; % соответствующая частота дискретизации I = 8 ; % передискретизировать версию отображения синусоид cycles_per_DFT = 13 ; cycles_per_sample = cycles_per_DFT / ( I * samples_per_DFT ); signal1I = sin ( 2 * pi * cycles_per_sample * ( - 32 * I : 96 * I )); % дополнить окно [0,64] до ±32 window1 = signal1I ( 32 * I + ( 1 : samples_per_DFT * I + 1 )); % извлечь окно signal1 = window1 ( 1 : I : samples_per_DFT * I ); % уменьшить частоту передискретизации cycles_per_DFT = 13.50 ; % повторить шаги для более высокой частоты cycles_per_sample = cycles_per_DFT / ( I * samples_per_DFT ); signal2I = sin ( 2 * pi * cycles_per_sample * ( - 32 * I : 96 * I )); window2 = signal2I ( 32 * I + ( 1 : samples_per_DFT * I + 1 )); signal2 = window2 ( 1 : I : samples_per_DFT * I ); фильтр = нули ( 1 , длина ( сигнал1I )); % изображают прямоугольное окно юбка = 10 ; фильтр ( 32 * I + ( - юбка + 1 : выборки_на_ДПФ * I + юбка )) = 1.2 ; %======================================================== hfig = figure ( "position" ,[ 1-891200800 ] , " color " , frame_background ) ; x1 = .08 ; % левое поле для аннотации x2 = .02 ; % правое поле ws = .05 ; % пробел между графиками y1 = .08 % нижнее поле y2 = .08 % верхнее поле dy = .08 ; % вертикальное пространство между строками height = ( 1 - y1 - y2 - 3 * dy ) / 4 ; % пространство, выделенное для каждой из 4 строк % Вычислить ширину синусоидальных графиков xwhite = x1 + ws + ws + x2 ; % общее количество пробелов в строке, содержащей 3 графика width1 = ( 1 - xwhite ) / 3 ; % ширина всех синусоидальных графиков y_origin = 1 ; % начать в верхней части области графика %========================================================= % Построить синусоиду без окна x_origin = x1 ; y_origin = y_origin - y2 - height ; % позиция верхней строки подграфика ( "position" ,[ x_origin y_origin width1 height ]) plot (( - 32 * I : 96 * I ), signal1I , "цвет" , "черный" ) xlim ([ - 32 96 ] * I ) %ylim([-2 2]) set ( gca , "xaxislocation" , "origin" ) xlabel ( "без окна" ) %========================================================= % Построить 13-периодную синусоиду и прямоугольное окноx_origin = x_origin + width1 + ws ; подзаголовок ( "position" ,[ x_origin y_origin width1 height ]) plot ( 0 : length ( window1 ) - 1 , window1 , "color" , "blue" ) xlim ([ - 32 96 ] * I ) %ylim([-2 2]) set ( gca , "xaxislocation" , "origin" ) hold on plot (( - 32 * I : 96 * I ), filter , "color" , "black" , "linewidth" , 2 ) xlabel ( "13 cycles" ) %========================================================= % Построить 13½-периодную синусоиду и прямоугольное окноx_origin = x_origin + width1 + ws ; подзаголовок ( "position" ,[ x_origin y_origin width1 height ]) plot ( 0 : length ( window2 ) - 1 , window2 , "color" , "red" ) xlim ([ - 32 96 ] * I ) %ylim([-2 2]) set ( gca , "xaxislocation" , "origin" ) hold on plot (( - 32 * I : 96 * I ), filter , "color" , "black" , "linewidth" , 2 ) %xlabel("13½ cycles") % не работает %======================================================== % Вычислить и построить преобразование Фурье двух синусоидx_origin = x1 ; y_origin = y_origin - dy - height ; width2 = 1 - x1 - x2 ; subplot ( "position" ,[ x_origin y_origin width2 height ]) N = выборок_на_DTFT ; Гц_на_бин = выборок_в_сек / N ; S1 = abs ( fft ( signal1 , N )); S1 = 20 * log10 ( S1 ( 1 : N / 2 )); S1 = max ( 0 , S1 ); plot (( 0 : длина ( S1 ) - 1 ) * Гц_на_бин , S1 , "цвет" , "синий" , "ширина линии" , 1 ); ylim ([ 0 макс ( S1 ) + 6 ]) xlim ([ 0 выборок_в_сек / 2 ]) set ( gca , "xtick" , 0 : DFT_display_bins ) % set(gca, "ytick",0:10:ylim(2)) % нет, нет, нет. Он переопределяет ylim. set ( gca , " ytick" , 0 : 10 :( max ( S1 ) + 6 )) подожди S2 = abs ( fft ( signal2 , N )); S2 = 20 * log10 ( S2 ( 1 : N / 2 )); S2 = max ( 0 , S2 ); plot (( 0 : длина ( S2 ) - 1 ) * Гц_на_бин , S2 , "цвет" , "красный" , "ширина линии" , 1 ); % Вставить дельта-функцию для неоконной основы преобразования ( 13 , 35 , "^" , "MarkerSize" , 5 + ds , "linewidth" , 2 , "color" , "black" , "markeredgecolor" , "black" , "markerfacecolor" , "black" ) ylabel ( "децибелы" ) xlabel ( '\leftarrow частота \rightarrow' )%======================================================== % Повторный график 13-периодной синусоидыy_origin = y_origin - dy - height ; подграфик ( "position" ,[ x_origin y_origin width1 height ]) plot ( 0 : длина ( window1 ) - 1 , window1 , "цвет" , "синий" ) xlim ([ 0 длина ( window1 ) - 1 ]) %ylim([-2 2]) set ( gca , "xaxislocation" , "origin" ) hold on % Наложение непрерывной синусоиды на график дискретных выборок ( 0 : I : samples_per_DFT * I - 1 , signal1 , "color" , "blue" , ". " , "MarkerSize" , 5 + ds ) xlabel ( "discrete-time (sampled)" ) %======================================================== % Повторно построить преобразование Фурье, но обрезать его, чтобы оно соответствовало меньшему пространству.x_origin = x_origin + width1 + ws ; width3 = 1 - x_origin - x2 ; подзаголовок ( "position" ,[ x_origin y_origin width3 height ]) Гц_на_бин = выборок_на_сек / выборок_на_DTFT ; % DFT_display_bins = 32. Усечение графика до 22 интервалов: N = 22,5 / 32 * длина ( S1 ); plot (( 0 : N - 1 ) * Hz_per_bin , S1 ( 1 : N ), "цвет" , "синий" , "ширина линии" , 1 ); ylim ([ 0 max ( S1 ) + 6 ]) xlim ( [ 0 N - 1 ] * Hz_per_bin ); set ( gca , "xtick" , 0 : 22 ) удержание % Вычислить и наложить дискретные значения ДПФ N = samples_per_DFT ; Hz_per_bin = samples_per_sec / N ; S = abs ( fft ( signal1 , N )); S = 20 * log10 ( S ( 1 : N / 2 )); S = max ( 0 , S ); N = 23 ; plot (( 0 : N - 1 ) * Hz_per_bin , S ( 1 : N ), "цвет" , "синий" , "."" , "РазмерМаркера" , 10 + dl ); set ( gca , "xtick" ,( 0 : N - 1 ) * Hz_per_bin ) %======================================================== % Повторный график 13½-периодной синусоидыx_origin = x1 ; y_origin = y_origin - dy - height ; subplot ( "position" ,[ x_origin y_origin width1 height ]) plot ( 0 : длина ( window2 ) - 1 , window2 , "цвет" , "красный" ) xlim ([ 0 длина ( window2 ) - 1 ]) %ylim([-2 2]) set ( gca , "xaxislocation" , "origin" ) hold on % Наложение непрерывной синусоиды на график дискретных выборок ( 0 : I : samples_per_DFT * I - 1 , signal2 , "color" , "red" , ". " , "MarkerSize" , 5 + ds ) xlabel ( "discrete-time (sampled)" ) %======================================================== % Повторно построить преобразование Фурье, но обрезать его, чтобы оно соответствовало меньшему пространству.x_origin = x_origin + width1 + ws ; подзаголовок ( "position" ,[ x_origin y_origin width3 height ]) Гц_на_бин = выборок_на_сек / выборок_на_DTFT ; % DFT_display_bins = 32. Усечение графика до 22 интервалов: N = 22,5 / 32 * длина ( S2 ); plot (( 0 : N - 1 ) * Hz_per_bin , S2 ( 1 : N ), "цвет" , "красный" , "ширина линии" , 1 ); ylim ([ 0 max ( S2 ) + 6 ]) xlim ( [ 0 ( N - 1 ) * Hz_per_bin ]) set ( gca , "xtick" , 0 : 22 ) удержание % Вычислить и наложить дискретные значения ДПФ N = samples_per_DFT ; Hz_per_bin = samples_per_sec / N ; S = abs ( fft ( signal2 , N )); S = 20 * log10 ( S ( 1 : N / 2 )); S = max ( 0 , S ); N = 23 ; plot (( 0 : N - 1 ) * Hz_per_bin , S ( 1 : N ), "color" , "red" , "."" , "MarkerSize" , 10 + dl ); set ( gca , "xtick" ,( 0 : N - 1 ) * Hz_per_bin ) xlabel ( "DFT bins" )