Beispiel #1
0
    def construct(self):
        params = FFT_Song.getSongFormula("jojoVoice2.wav", 0)
        np_params = np.array(params)
        freq = np.array([0] * 5000)  # 取前5000个频率及其对应强度
        amplitudes = np.array([0] * 5000)
        for i in range(5000):
            p = params[i]
            freq[i] = p[1]
            amplitudes[i] = p[2]

        y_max = FRAME_Y_RADIUS
        x_max = FRAME_WIDTH
        self.camera.set_frame_center((x_max / 2, 1, 0))
        self.camera.set_frame_height(y_max * 2 + 4)
        self.camera.set_frame_width(x_max + 2)

        #  max_freq = 5000
        # max_amplitude = 500

        axes = Axes(
            x_min=0,
            x_max=x_max + 0.5,
            y_min=-y_max - 0.5,
            y_max=y_max + 0.5,
        )
        y_tex = TextMobject("相位")
        y_tex.set_x(0.5)
        y_tex.set_y(y_max)
        y_tex.scale(0.7)
        x_tex = TextMobject("频率")
        x_tex.set_x(x_max + 0.5)
        x_tex.set_y(0.5)
        x_tex.scale(0.7)
        title_tex = TextMobject("相位谱")
        title_tex.set_stroke(GREEN_C, 1)
        title_tex.scale(0.7)
        title_tex.set_x(x_max / 2)
        title_tex.set_y(y_max)

        g = VGroup(axes, y_tex, x_tex, title_tex)
        g.shift((0, 1, 0))
        curve = VMobject()
        max_freq = max(freq)
        max_amplitude = max(amplitudes)
        curve.set_points_smoothly([
            (freq[i] / max_freq * x_max,
             amplitudes[i] / max_amplitude * y_max / 2, 0)
            for i in range(len(freq))
        ])
        curve.set_stroke(GREEN_C, 0.6)
        curve.shift((0, 1, 0))

        # self.add(g)
        self.play(ShowCreation(g))
        self.play(ShowCreation(curve))
        self.wait(2)
Beispiel #2
0
    def construct(self):
        params = FFT_Song.getSongFormula("jojoVoice2.wav", 1)
        # fun = lambda x: sum([
        #         param[0] * np.sin(2 * PI *param[1]* x + param[2]/180*PI)
        #         for param in params
        #     ])

        texes = []
        str1 = "y="
        for i in range(3):
            param = params[i]
            str1 += "{}cos(2\\pi x\\times {} ".format(
                param[0] if (param[0] != 1) else '', param[1])
            if param[2] > 0:
                str1 += "+"
            else:
                str1 += "-"
            str1 += "{" + str(abs(param[2])) + "\\over 180}\\pi)"
        tex1 = TexMobject(str1)
        tex1.scale(0.6)
        tex1.set_y(3.5)
        texes.append(tex1)

        for k in range(6):
            str2 = "+"
            for i in range((k + 1) * 3, (k + 2) * 3):
                param = params[i]
                str2 += "{}cos(2\\pi x\\times {} ".format(param[0], param[1])
                if param[2] > 0:
                    str2 += "+"
                else:
                    str2 += "-"
                str2 += "{" + str(abs(param[2])) + "\\over 180}\\pi)"
                if i % 3 < 2:
                    str2 += "+"
            tex2 = TexMobject(str2)
            tex2.scale(0.6)
            tex2.set_y(2.5 - k)
            texes.append(tex2)

        str3 = "+\\cdots \\cdots \\cdots"
        tex3 = TexMobject(str3)
        tex3.scale(0.6)
        tex3.set_y(2.5 - 6)
        texes.append(tex3)

        g = VGroup(*texes)
        self.play(ShowCreation(g))
        self.wait(2)
Beispiel #3
0
    def construct(self):
        data, Fs, N = FFT_Song.getSongData("joDelBGM.wav")

        x_scale = 0.01
        y_max = 1000
        frame_width = len(data) * x_scale
        self.camera.set_frame_center((frame_width / 2, 0, 0))
        self.camera.set_frame_height(y_max * 2)
        self.camera.set_frame_width(frame_width)

        curve = VMobject()
        max_amplitude = max(data)
        curve.set_points_smoothly([(x_scale * i,
                                    data[i] / max_amplitude * y_max, 0)
                                   for i in range(len(data))])

        curve.set_stroke(BLUE_E, 0.5)
        self.play(ShowCreation(curve))
        # self.add(curve)
        # self.play(ShowCreation(Axes()))
        self.wait(2)
Beispiel #4
0
    def construct(self):
        params = FFT_Song.getSongFormula("jojoVoice2.wav", 0)

        np_params = np.array(params)
        freq = np.array([0] * 4200)  # 取前5000个频率及其对应强度
        amplitudes = np.array([0] * 4200)
        for i in range(4200):
            p = params[i]
            freq[i] = p[1]
            amplitudes[i] = p[0]

        y_max = FRAME_Y_RADIUS
        x_max = FRAME_WIDTH
        self.camera.set_frame_center((x_max / 2, y_max / 2 + 1, 0))
        self.camera.set_frame_height(y_max + 2)
        self.camera.set_frame_width(x_max + 1)

        axes = Axes(
            x_min=0,
            x_max=x_max + 0.5,
            y_min=0,
            y_max=y_max + 0.5,
        )
        y_tex = TextMobject("强度")
        y_tex.set_x(0.5)
        y_tex.set_y(y_max)
        y_tex.scale(0.7)
        x_tex = TextMobject("频率")
        x_tex.set_x(x_max)
        x_tex.set_y(0.5)
        x_tex.scale(0.7)
        title_tex = TextMobject("原音频频谱")
        title_tex.set_stroke(MAROON_B, 1)
        title_tex.scale(0.7)
        title_tex.set_x(x_max / 2)
        title_tex.set_y(y_max)

        g = VGroup(axes, y_tex, x_tex, title_tex)
        g.shift((0, 1, 0))
        max_freq = max(freq)
        max_amplitude = max(amplitudes)
        curve = VMobject()
        curve.set_points_smoothly([(freq[i] / max_freq * x_max,
                                    amplitudes[i] / max_amplitude * y_max, 0)
                                   for i in range(len(freq))])

        numTexs = []
        for i in range(14):
            num = 300 * (i + 1)
            numTex = TextMobject(str(num))
            numTex.shift((i + 1, 0.7, 0))
            numTex.scale(0.4)
            numTexs.append(numTex)
        numGroup = VGroup(*numTexs)

        curve.set_stroke(MAROON_B, 0.6)
        curve.shift((0, 1, 0))
        self.play(ShowCreation(g))
        self.play(ShowCreation(numGroup))
        self.play(ShowCreation(curve))
        self.wait(2)

        params = FFT_Song.getSongFormula("jo65_1100.wav", 0)
        freq = np.array([0] * 5000)  # 取前5000个频率及其对应强度
        amplitudes = np.array([0] * 5000)
        for i in range(5000):
            p = params[i]
            freq[i] = p[1]
            amplitudes[i] = p[0]
        curve2 = VMobject()
        curve2.set_points_smoothly([(freq[i] / max_freq * x_max,
                                     amplitudes[i] / max_amplitude * y_max, 0)
                                    for i in range(len(freq))])
        curve2.shift((0, 1, 0))
        curve2.set_stroke(GREEN_C, 0.6)
        title_tex2 = TextMobject("保留原音频65-1100Hz后的频谱")
        title_tex2.set_stroke(GREEN_C, 1)
        title_tex2.scale(0.7)
        title_tex2.set_x(x_max / 2)
        title_tex2.set_y(y_max + 1)

        self.play(Transform(curve, curve2), Transform(title_tex, title_tex2))
        self.wait(2)

        params = FFT_Song.getSongFormula("jo270_3000.wav", 0)
        freq = np.array([0] * 5000)  # 取前5000个频率及其对应强度
        amplitudes = np.array([0] * 5000)
        for i in range(5000):
            p = params[i]
            freq[i] = p[1]
            amplitudes[i] = p[0]
        curve2 = VMobject()
        curve2.set_points_smoothly([(freq[i] / max_freq * x_max,
                                     amplitudes[i] / max_amplitude * y_max, 0)
                                    for i in range(len(freq))])
        curve2.shift((0, 1, 0))
        curve2.set_stroke(BLUE_E, 0.6)

        title_tex2 = TextMobject("保留原音频270-3000Hz后的频谱")
        title_tex2.set_stroke(BLUE_E, 1)
        title_tex2.scale(0.7)
        title_tex2.set_x(x_max / 2)
        title_tex2.set_y(y_max + 1)

        self.play(Transform(curve, curve2), Transform(title_tex, title_tex2))
        self.wait(2)